È un modo standard per progettare un database?


8

Di recente ho appreso come vengono definite le relazioni nel database al lavoro e mi chiedevo se si tratta di una pratica standard.

Supponiamo di avere due processi: Processo A e Processo B. Il processo B dipende dai risultati del processo A, quindi esiste una relazione che deve essere definita tra un'esecuzione del processo B e un'esecuzione del processo A. Ecco come viene definita la relazione:

TableProcessA:
Id

e

TableProcessB:
Id
ProcessAId

Ora, fino a questo punto, le cose hanno un senso per me, ma poi le cose diventano un po 'strane per me e la mia comprensione del design del tavolo. Ogni volta che viene creata una riga in TableProcessA o TableProcessB, viene chiamata una funzione che crea un ID univoco globale per ciascuno. Quindi, in sostanza, tutti i campi Id in TableProcessA e TableProcessB non conterranno alcuna corrispondenza poiché gli ID non sono solo univoci per la sua tabella, ma per l'intero database.

La mia domanda è: quanto è standard? Mi è venuta l'idea che ogni tabella dovrebbe semplicemente avere un ID autoincrementante che è unico solo per la tabella e non per l'intero database.


3
potrebbe essere di interesse: dba.stackexchange.com/questions/322/…
— Derek Downey,

Louis Davidson ha molti post sulla progettazione di database: sqlblog.com/blogs/louis_davidson/archive/tags/Database+Design/… . Fare attenzione quando si memorizzano i dati separatamente per processo a meno che non sia solo per la registrazione.
— Eric Humphrey - lotsahelp,

Risposte:


7

Non è una pratica così strana. Questi sono chiamati GUID o ID globalmente univoci. L'idea è che, dato un GUID, puoi dire esattamente a quale dato appartiene l'id perché sarà unico ovunque . I GUID sono utilizzati al meglio quando si uniranno diverse fonti di dati simili; ad esempio inventario per diversi negozi.

Vorrei fare qualche ricerca e scoprire perché questa è una pratica comune nel tuo ambiente. Forse è necessario, forse no.


4

In linea di principio, avere ID univoci in un database non è male, ma è piuttosto insolito nella mia esperienza. A meno che non vi sia un requisito specifico per il mantenimento di chiavi ID univoche a livello globale, l'utilizzo dell'identità normale dovrebbe andare bene poiché i tipi di entità o gli oggetti tendono a essere specifici del tipo e di solito non comportano join inappropriati.

A parte la tua domanda, ti consiglio vivamente di non usare i GUID come chiavi primarie o surrogate in quanto occupano il 4x dello spazio di un int. Ora ai tempi dei dischi multi-gigabyte potresti dire che non è importante ma quando hai qualche milione di righe di dati ci vogliono ancora risorse per leggere dal disco o trasferire attraverso una rete, ancora di più se vengono inclusi in qualsiasi indice. Mentre sono sugli indici dei soggetti, i GUID sono cattivi nelle chiavi primarie a causa della loro natura casuale e di solito causa una frammentazione significativa.

Ora è probabile che sia troppo tardi per questo database, ma ricordalo per il futuro


4

I processi possono creare record che contengono il GUID come riferimento all'istanza del processo, ma l'utilizzo dei GUID come chiave non è necessariamente ottimale.

Vedo tre principali svantaggi dell'utilizzo dei GUID come chiavi di database e li eviterei a meno che tu non abbia qualche motivo convincente per usarli. Si noti che la proprietà unica a livello globale non offre alcun vantaggio rispetto all'utilizzo di una chiave localmente unica all'interno di una tabella, poiché si conosce già da quale tabella provengono i dati.

Inconveniente: non è terribilmente facile digitare un GUID se si desidera eseguire una query ad hoc del database, ad esempio:

select *
  from Foo
 where FooID = 12345

vs

select *
  from Foo
 where FooID = convert (uniqueidentifier, '5E64E653-35F0-4803-B459-F5F59C701F22')

Quest'ultimo praticamente significa che hai bisogno di una fonte del GUID da cui tagliare e incollare.

2. Ordinalità naturale: una chiave primaria autoincrementante ha l'effetto collaterale di ordinare naturalmente le tue transazioni nell'ordine in cui sono state inserite nel sistema. Questo è spesso abbastanza utile. I GUID non vengono normalmente generati in ordine, quindi non sono utili a questo proposito.

3. Dimensione: meno problemi in questi giorni, ma un GUID è lungo 16 byte. Occupa più spazio nella tabella e in tutti gli indici che la includono.


L'ID univoco a livello globale è in realtà un numero intero pari a ++ ogni volta che ce n'è uno nuovo. È una pratica comune o i GUID sono sempre lunghi 16 byte?
— sooprise,

I GUID sono 128 bit (16 byte) in modo da avere uno spazio dei nomi sufficientemente grande. Tradizionalmente includono elementi unici come indirizzi MAC e timestamp in modo da dare a una parte del valore una base davvero unica. Mi chiedo quali tipi siano i tuoi identificatori e se siano realmente GUID - normalmente i GUID sono almeno parzialmente casuali.
— Preoccupato di

Gli ID vengono generati cercando tutti gli ID, prendendo il massimo e aggiungendo 1.
— sooprise

0

Non dirò che è normale, ma non è anormale nemmeno impostare le cose in questo modo.


2
-1 così com'è, questa risposta non fornisce davvero nulla di utile.
— Derek Downey,

1
tecnicamente risponde alla domanda
— DForck42

2
Risposte, si. Fornisce qualcosa di utile, no.
— Matt Hanson,

Denny - come moderatore e DBA di grande esperienza, sono sorpreso che tu non abbia aggiunto qualche dettaglio in più alla tua risposta. Forse sarebbe bello dire perché la generazione casuale di un GUID è una cattiva pratica in generale, o perché non rappresenta un problema in termini di unicità. Allo stato attuale, il sistema vuole sapere se dovrei raccomandare la cancellazione del tuo post.
— Max Vernon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.