2010-03-06 5 views
5

Ich erstelle eine neue Tabelle in SQL Server 2005, die 2 Felder benötigt: DateTime und MyValue (Int32). Das DateTime-Feld wird eindeutig sein, so dass ich eine eindeutige Einschränkung dafür festlegen werde.SQL Server-Primärschlüssel auf Datetime-Feld

Welche Tabellenstruktur ist besser und warum?

MyIndex (PK, int)
MyDate (Datumzeit) (IX_UniqueKey)
MyValue (int)

oder

MyDate (PK, DATETIME)
MyValue (int)

Mein Gefühl ist, dass ich keine künstliche PK (MyIndex) in dieser Tabelle will, weil es unnötig ist und weil die Daten einzigartig sein werden, werde ich sie verwenden, um auf jede Aufzeichnung zuzugreifen. Es kann jedoch sein, dass es leistungsfähiger ist, eine künstliche PK zu haben ...?

+0

Persönlich würde ich MyDate, MyIndex, MyValue usw. nicht verwenden. Was fügt das Präfix "My" hinzu?Warum nicht EventDate oder EventDateTime und [Value] oder EventValue? Wenn die Datumswerte eindeutig sind, gehe ich davon aus, dass die Auflösung der Stunde oder dem Tag entspricht. Wenn ja, dann besser mit SMALLDATETIME als DATETIME. –

+2

@Aaron Bertrand, ich denke, das war nur ein Beispiel, und die DATETIME kann zu der Sekunde/Millisekunde sein. –

+0

Richtig - dies ist eine Zusammenfassung dessen, was die tatsächliche Tabelle sein wird. – Guy

Antwort

9

Wenn Sie sagen, die Daten werden einzigartig sein, meinst du denken werden sie einzigartig sein, oder ihre Einzigartigkeit wird durch die Angabe des Problems garantiert? Meiner Erfahrung nach erweisen sich einige Dinge als viel weniger einzigartig, als man sich vorstellt (die US-Sozialversicherungsnummern sind ein Beispiel).

Wenn die Datumswerte nicht garantiert eindeutig sind, sollten Sie den Ganzzahlschlüssel hinzufügen.

Wenn die Datumswerte eindeutig sind, ändern sie sich? Wenn sie sich ändern, werden sie von anderen Tabellen referenziert? Wenn beide Antworten "Ja" sind, sollten Sie wahrscheinlich den Ganzzahlschlüssel hinzufügen.

Wenn die Datumswerte garantiert eindeutig sind und sich nicht ändern oder nicht referenziert werden, können Sie sie für den Schlüssel verwenden. Reguläre DATETIMEs sind 8 Byte und Standard-INTEGER-Werte sind 4 Byte, was sich auf die Indexierung nur geringfügig auswirkt. Wenn Ihre Datumswerte nur Datumsangaben sind oder nur auf die Minute oder weniger genau und in dem vom Typ zulässigen eingeschränkteren Bereich, können Sie SMALLDATETIME verwenden und diese Indexwerte auf 4 Byte reduzieren.

+0

Das Datumsfeld ist insofern einzigartig, als es Informationen pro Tag speichert. Zum Beispiel tägliche Besucher eines Nationalparks. So wird es für jeden Tag in der Geschichte nur einen Rekord geben, der die Anzahl der Besucher an diesem Tag misst. Auf Ihren Punkt klingt smalldatetime wie ein besserer Datentyp für dieses Feld, weil die Zeit nicht relevant ist. – Guy

1

Nein, Ihre Intuition ist korrekt. Solange niemand zwei (oder vermutlich auch mehr) gleichzeitige Ereignisse bei der gegebenen Auflösung Ihres Datensammelprozesses über sich ergehen lassen kann, sind Sie gut beraten.

1

Wenn Sie die Garantie haben, dass die Datumsangaben immer eindeutig sind (denken Sie an die Auflösung der Zeitkomponente), dann ist das Erstellen des Primärschlüssels in der Datetime-Spalte eine gute Wahl.

Wenn Sie immer nur steigende Datumsangaben einfügen, ist auch das Erstellen des Clustered-Index für Ihre Primärschlüsselspalte eine gute Wahl.

2

Wenn der DATETIME- Wert wird von der Datenbank IE gefüllt werden:

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

... dann ja, was die mydate Spalte der Primärschlüssel ist die ideale Lösung. Wenn das Datum durch die Anwendung IE zur Verfügung gestellt:

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

... @my_date_value Annahme wird nicht von der Datenbank geliefert werden - nein, nicht ideal. Es kann nicht garantiert werden, dass eine Datetime aus einem anderen als der Datenbank basierend auf dem Einfügen korrekt ist.