5

Sto lavorando a un sistema distribuito che utilizza i principi CQRS e DDD. Sulla base di ciò ho deciso che le chiavi primarie delle mie entità dovrebbero essere guids, che sono generate dal mio dominio (e non dal database).Chiave primaria in un database SQL di Azure

Ho letto dei guidi come chiavi primarie. Tuttavia, sembra che alcune delle migliori pratiche non siano più valide se applicate al database SQL di Azure.

  1. GUID sequenziali sono bello se si utilizza un server di premessa sulla macchina SQL - i GUID sequenziali che vengono generati sarà sempre unico. Tuttavia, su Azure, questo non è più il caso. Come discusso in this thread, non è nemmeno supportato più; generarli è anche una cattiva idea in quanto diventa un singolo punto di errore e non sarà più garantito univoco tra i server. Immagino che le spie sequenziali non abbiano senso in Azure, quindi dovrei attenermi ai normali guids. È corretto?

  2. Le colonne di tipo Guid sono cattivi candidati per il raggruppamento. Ma this article afferma che questo non è il caso in Azure e this one suggerisce il contrario! Quale dovrei credere? Dovrei semplicemente rendere la mia chiave primaria un guid e lasciarla in cluster (dato che è l'impostazione predefinita per le chiavi primarie); o non dovrei renderlo in cluster e scegliere un'altra colonna per il clustering?

Grazie per qualsiasi intuizione!

+1

Sia cqs che ddd non richiedono che la chiave primaria debba essere GUID. Il tipo di chiave primaria dovrebbe essere basato solo sul tipo di dati che dovrebbe essere archiviato e non da alcuni blog blogging su di esso. GUID è dannoso per il debug, è estremamente difficile da correlare e il cliente/gli utenti si lamenterà perché non è possibile utilizzare numeri semplici per identificare le entità. –

+0

Sto ancora cercando risposte autorevoli e non supposizioni. Ecco perché non ho assegnato la taglia. – jgauffin

risposta

1

I casi in sequenza generati saranno sempre univoci. Tuttavia, su Azure, questo non è più il caso.

Date un'occhiata in fondo a questo post qui - http://blogs.msdn.com/b/sqlazure/archive/2010/05/05/10007304.aspx

Il problema con Guid di (che si basano sulla NEWID()) è che essi saranno distribuite in modo casuale, che ha problemi di prestazioni quando si tratta di applicare una raggruppati indicali a loro.

Quello che suggerirei è che si utilizza un GUID per la chiave primaria. Quindi rimuovere l'indice cluster predefinito da quella colonna. Applicare l'indice cluster in un altro campo della tabella (ad esempio la data di creazione) in modo che i record vengano indicizzati in sequenza/in modo contiguo man mano che vengono creati. E quindi applica un indice non in cluster alla tua colonna guida PK.

Le probabilità sono, che sarà bene da un * SELECT * FROM tabella WHERE Id = "punto di vista per la restituzione singoli casi.

Allo stesso modo, se si sta tornando liste o intervalli di record per la visualizzazione in un lista, se si specifiy l'ordine predefinito per CreatedDate, l'indice cluster funzionerà per quel

+0

Questo è davvero l'articolo che ho menzionato, ma l'altro articolo afferma che non è più necessario con Azure ... –

2

Considerando la seguente

  1. SQL Azure richiede un indice cluster per eseguire la replica. Nota, l'indice non deve essere unico. http://blogs.msdn.com/b/sqlazure/archive/2010/05/12/10011257.aspx

  2. Il vantaggio di un indice cluster è che le query di intervallo sull'indice vengono eseguite in modo ottimale con ricerche minime.

  3. Gli svantaggi di un indice cluster sono che, se i dati vengono aggiunti nell'ordine in sequenza, potrebbe verificarsi una divisione della pagina e gli inserimenti potrebbero essere relativamente più lenti.

Riferimenti a quanto sopra, suggerisco il seguente

  1. Se si dispone di un vero e proprio campo di chiave è necessario interrogare su, ad esempio la data, numero sequenziale ecc
    1. creare un (unico/indice cluster non univoco per quella chiave.
    2. creare un indice univoco aggiuntivo con GUID generati dal dominio.
  2. Se non esiste un intervallo di chiavi reale, è sufficiente creare l'indice univoco cluster con GUID generati dal dominio. (Le spese generali per aggiungere un indice cluster falso non necessario sarebbero più di un ostacolo di un aiuto.)
Problemi correlati