Wenn ich das folgende Tabellendesign verwende, um den Verlauf zu erfassen ...:
CREATE TABLE MyTable (
insertion_timestamp TIMESTAMP,
deleted_flag BOOLEAN,
natural_key INT,
attribute VARCHAR
);
... was soll dann der Primärschlüssel sein?
(Der Verlaufsmechanismus ist INSERT
-only: Aktualisierte Zeilen werden mit einem anderen eingefügt insertion_timestamp
, und gelöschte Zeilen werden mit einem anderen Zeitstempel eingefügt und auf deleted_flag
gesetzt true
.)
Ich denke PRIMARY KEY (insertion_timestamp, deleted_flag, natural_key)
, aber der einzige Grund für das Einschließen deleted_flag
besteht darin, die Möglichkeit zu berücksichtigen, dass eine Zeile eingefügt und dann (weich) sofort gelöscht wird, früher als das nächste Häkchen der Granularität des TIMESTAMP
Datentyps. Das fühlt sich übermäßig paranoid an ...
insertedAt
,isActive
(!deleted_flag
).Antworten:
Ich weiß nicht, ob es zu paranoid ist, aber es ist vernünftig, nur festzulegen, dass keine zwei Zeilen dasselbe
insertion_timestamp
und dasselbe teilen dürfennatural_key
, und es in die Verantwortung der Kunden zu legen, die die Einfügungen ausführen, um den Randfall zu behandeln. Es vereinfacht die Verwendung der Tabelle erheblich, wenn Sie davon ausgehen können, dass diese Kombinationen eindeutig sind. Außerdem ist es in dem von Ihnen vorgeschlagenen dreigliedrigen Schlüssel schwierig, die Zeilen im dreifach-paranoiden Fall zu ordnen, in dem zwei sofortige "weiche" Löschvorgänge in einer Zeile vorhanden sind.Meine Empfehlung wäre also
PRIMARY KEY (natural_key, insertion_timestamp)
(in dieser Reihenfolge - aber ich vermutenatural_key
, dass sie öfter abgefragt wird, was falsch sein könnte).Außerdem sollten Sie die folgenden Ergänzungen ernsthaft in Betracht ziehen:
inactive_timestamp
den Tabellen eine Spalte hinzu. Auf diese Weise können Sie nach Zeilen abfragen, die zu einem bestimmten Zeitpunkt aktiv waren.quelle
In vielen Anwendungen ist es üblich, eine von der Datenbank automatisch generierte Nummer wie eine Sequenznummer als PK zu verwenden. Wenn die Tabelle keinen natürlichen Schlüssel hat und Sie keinen künstlichen Schlüssel verwenden möchten (wie ich vorgeschlagen habe) und die Tabelle keine übergeordnete Tabelle ist, müssen Sie überhaupt keine PK erstellen (Sie können dies trotzdem tun) Erstellen Sie nicht eindeutige Indizes für eine beliebige Kombination von Spalten.
quelle