Ist dies ein gutes oder schlechtes Design, um standardmäßig ein ID-Feld in jede Tabelle in einer Datenbank einzufügen, auch wenn Sie derzeit nicht sehen, dass diese ID verwendet wird (z. B. in einer MxN-Tabelle)?
database-design
Pierre Watelet
quelle
quelle
Antworten:
In vielen Fällen ist es sehr praktisch, auf jedem Tisch einen künstlichen Ausweis zu haben. In einigen Fällen ist es nur ein Schmerz in der A **.
Im Allgemeinen mache ich das bei jedem Projekt, an dem ich arbeite.
Vorteile:
Im Allgemeinen ist es einfacher, Zugriffscode zu schreiben oder zu generieren, wenn auf jede Tabelle über ein Schlüsselfeld namens
ID
type zugegriffen werden kannInteger
.Manchmal sind natürliche Schlüssel flüchtig. In einem bereits sehr komplexen Lagerverwaltungssystem standen wir beispielsweise vor der Aufgabe, dass sich Produktcodes ändern, z. B. wird das Produkt 001234 in Zukunft als 002345 bezeichnet. Leider verwendete dieses System keine künstlichen IDs, sondern den Produktcode als Primärschlüssel. Natürlich war der Produktcode auch ein Fremdschlüssel in Dutzenden anderer Tabellen. Daher war die Umnummerierung sehr schwierig und teuer und konnte während der Arbeitszeit nicht durchgeführt werden. Die nächste Version der Software verwendete künstliche IDs, daher war es nur ein einfaches UPDATE in der Produkttabelle.
Manchmal sind natürliche Schlüssel nicht eindeutig, selbst wenn sie es sollten. In meinen Ländern wurden aus bestimmten Gründen einige SSN zweimal ausgestellt.
Konzentrierte Schlüssel werden umständlich, wenn die Datenstruktur komplex ist. Es ist ziemlich schmerzhaft, mit einer Sub-Sub-Sub-Tabelle mit einem aus 4 Teilen zusammengesetzten Schlüssel zu arbeiten.
Nachteile:
Diese IDs haben naturgemäß keine Bedeutung außerhalb des Systems. Daher benötigen Sie viele Suchvorgänge, um diese IDs in natürliche Schlüssel zu übersetzen.
Um den obersten Schlüssel aus dieser Sub-Sub-Sub-Tabelle zu erhalten, ist eine große Verknüpfung durch die gesamte Hierarchie erforderlich.
Das Zusammenführen eingehender Daten mit den vorhandenen Datensätzen ist schwieriger, da erneut mehr Suchvorgänge erforderlich sind.
quelle
ON UPDATE CASCADE
?Synthetische Schlüssel gegen natürliche Schlüssel und einzelne Schlüssel gegen zusammengesetzte Schlüssel sind beide heiß diskutierte Themen, die auf beiden Seiten gute positive und negative Eigenschaften haben. Sie sind wie Tabulatoren gegen Leerzeichen und geschweifte Klammern in ihren eigenen Liniendiskussionen.
Das Wichtigste ist, eine Seite auszuwählen und dabei zu bleiben, um die Konsistenz in der gesamten Datenbank zu gewährleisten. Im Allgemeinen werden synthetische Schlüssel verwendet, weil es schwierig ist, für jede Tabelle einen guten natürlichen Schlüssel zu haben, und es viel einfacher ist, konsistent zu sein, wenn jede Tabelle einen synthetischen Schlüssel hat.
quelle
Jede Tabelle sollte eine PK, eine eindeutige Kennung oder eine ID haben, wie Sie sie aufrufen. Im Fall von MxN haben Sie PK (eine zusammengesetzte). Es ist also nicht nötig, einen anderen zu haben.
Siehe auch: Ein oder zwei Primärschlüssel in einer Viele-zu-Viele-Tabelle?
Meine persönliche Präferenz zu einem verwandten Thema: PKs sollten keine andere Verwendung haben, als PK zu sein. Daher würde ich keine Daten aa PK verwenden, auch wenn die Daten "natürlich eindeutig" sind. IE: SSN, Datum, Postleitzahl Ect.
quelle
Entscheiden Sie sich aus gestalterischer Sicht für den natürlichen, zusammengesetzten Primärschlüssel und erfinden Sie keinen synthetischen. Alles, was nicht vorhanden sein muss, erschwert das Verständnis des Schemas.
Unter Leistungsgesichtspunkten ist es in vielen Datenbanken schneller, mit einem ganzzahligen Primärschlüssel auf eine Tabelle zuzugreifen als mit einer anderen indizierten Spalte. Diese Datenbanken fügen implizit auch einen solchen synthetischen Schlüssel zu jeder Tabelle hinzu, die keinen hat (normalerweise als "rowid" oder "oid" oder ähnliches bezeichnet), sodass das explizite Hinzufügen überhaupt nichts kostet.
Für MxN (Relation) -Tabellen ist es nicht sinnvoll, über den Primärschlüssel darauf zuzugreifen. Sie greifen über beide Komponenten darauf zu und erhalten die Gruppe der zugehörigen Entitäten von der anderen Seite. Für diese Tabellen ist es daher nicht sinnvoll, einen synthetischen Primärschlüssel hinzuzufügen.
Für andere Tabellen mit gut zusammengesetztem oder nicht ganzzahligem Primärschlüssel würde ich zunächst noch keinen synthetischen hinzufügen, sondern ihn während der Leistungsoptimierung für Tabellen hinzufügen, auf die in leistungskritischen Tabellen zugegriffen wird.
quelle