2010-03-06 14 views
5

Sto creando una nuova tabella in SQL Server 2005 che richiede 2 campi: DateTime e MyValue (Int32). Il campo DateTime sarà unico quindi imposterò un vincolo univoco su di esso.Chiave primaria di SQL Server sul campo Data/ora

Quale struttura del tavolo è migliore e perché?

MioIndice (PK, int)
MyDate (datetime) (IX_UniqueKey)
MyValue (int)

o

MyDate (PK, datetime)
MyValue (int)

La mia sensazione è che non voglio un PK (MyIndex) artificiale in questa tabella perché non è necessario e poiché le date saranno uniche, le userò per accedere a qualsiasi record. Tuttavia, potrebbe essere che sia più performante avere un PK artificiale ...?

+0

Personalmente non userei MyDate, MyIndex, MyValue ecc. Cosa aggiunge il prefisso "My"?Perché non EventDate o EventDateTime e [Value] o EventValue? Inoltre, se i valori della data saranno univoci, assumerò che la risoluzione sia all'ora o al giorno. Se è così, è meglio usare SMALLDATETIME di DATETIME. –

+2

@ Aaron Bertrand, penso che questo fosse solo un esempio, e il DATETIME può essere al secondo/millisecondo. –

+0

Corretto - questo è un riassunto di ciò che sarà la tabella attuale. – Guy

risposta

9

Quando dici che le date saranno uniche, intendi che tu rispondi allo allo, o che la loro unicità è garantita dall'affermazione del problema? Nella mia esperienza, alcune cose risultano essere molto meno uniche di quanto si possa immaginare (i numeri di previdenza sociale degli Stati Uniti sono un esempio).

Se i valori di data non sono garantiti univoci, è necessario aggiungere la chiave intera.

Se i valori di data sono univoci, cambiano? Se cambiano, fanno riferimento ad altre tabelle? Se entrambe le risposte sono "si", probabilmente dovresti aggiungere la chiave intera.

Se i valori di data sono univoci e non cambiano o non sono referenziati, è possibile utilizzarli per la chiave. I DATETIME regolari sono 8 byte e i valori standard INTEGER sono 4 byte che potrebbero avere un effetto minore sull'indicizzazione. Se i valori della data sono solo date, o solo esatti al minuto o meno, e nell'intervallo più limitato consentito dal tipo, puoi utilizzare SMALLDATETIME e ottenere quei valori di indice fino a 4 byte.

+0

Il campo data è univoco in quanto memorizza le informazioni su una base giornaliera. Ad esempio, visitatori giornalieri in un parco nazionale. Quindi ci sarà sempre un solo record per ogni giorno nella storia che misura il numero di visitatori in quel giorno. A questo punto, smalldatetime suona come un tipo di dati migliore per quel campo perché il tempo è irrilevante. – Guy

1

No, il tuo intuito è corretto. Fintanto che nessuno può far scivolare due (o suppongo di più) eventi simultanei su di te dato la risoluzione disponibile del tuo processo di raccolta dati, sei un hunky dory.

1

Se si ha la garanzia che i dati siano sempre univoci (si pensi alla risoluzione del componente temporale), la creazione della chiave primaria sulla colonna datetime è una buona scelta.

Se si inseriscono sempre più datetime, la creazione dell'indice cluster sulla colonna chiave primaria è anche una buona scelta.

2

Se il valore DATETIME sarà popolata da database IE:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (GETDATE(), 1234) 

... allora sì, rendendo la colonna mydate la chiave primaria è la soluzione ideale. Se la data è fornita dall'applicazione IE:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (@my_date_value, 1234) 

... assumendo @my_date_value non viene fornita dal database - no, non è l'ideale. Non è possibile garantire che una data/ora diversa da quella del database sia accurata in base all'inserimento.

Problemi correlati