Fügen Sie jeder Tabelle eine ID hinzu, auch wenn diese nicht benötigt wird?

8

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)?

Pierre Watelet
quelle
Wenn Sie keine ID-Spalte haben, würden andere Felder den Primärschlüssel bilden?
Thanos Papathanasiou
Normalerweise füge ich eine ID hinzu, wenn sie wahrscheinlich in einer anderen Tabelle verwendet werden ... es würde Platz sparen, wenn auch nur wenig
zfm

Antworten:

3

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 IDtype zugegriffen werden kann Integer.

  • 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.

user281377
quelle
2
Aufzählungszeichen 2: War das vorher ON UPDATE CASCADE?
Izkata
1
@Izkata, ich würde niemals eine Aktualisierungskaskade in einer Datenbank auf Unternehmensebene zulassen, da dies sehr wahrscheinlich zu Leistungs- / Blockierungs- / Sperrproblemen führt, wenn eine große Anzahl von Datensätzen geändert wird. Sie möchten die Benutzer wirklich nicht sperren, während 10.000.000 Datensätze aktualisiert werden. Aus diesem Grund glauben viele Leute, dass ein flüchtiger Schlüssel schlecht ist. Er verursacht zu viel Arbeit in der Datenbank, wenn er sich ändert.
HLGEM
@HLGEM Obwohl ich zugebe, keine Datenbank wie diese zum Herumspielen gehabt zu haben, scheint es mir, dass die Sperrung auf Zeilenebene von InnoDB dazu beitragen würde, diese zu verringern, insbesondere wenn zwischen dem Aktualisieren aller X-Datensätze Pausen hinzugefügt würden. Außerdem war das eigentliche Problem, wie ammoQ es beschrieb, das eigentliche Problem, dass alle Fremdschlüssel manuell geändert werden mussten (die MyISAM-Engine unter MySQL unterstützt dies beispielsweise nicht).
Izkata
Izkata: Das Problem bestand nicht darin, 30 Update-Anweisungen anstelle einer auszugeben. Dieser Teil ist einfach, auch ohne kaskadierende Updates. Das eigentliche Problem bestand darin, viele tausend Zeilen anstelle von einer zu betreffen, was zu Deadlocks im gesamten (zugegebenermaßen nicht allzu gut gestalteten) System führte. Schließlich gab es einen nächtlichen Job, um das zu tun.
user281377
1
+1 Nachteil: Es ist schwieriger, Daten zwischen verschiedenen Umgebungen (Entwickler,
At
6

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.

Ryathal
quelle
4

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.

Idioten
quelle
1
Sie widersprechen sich. Die Spalten des zusammengesetzten Schlüssels in der Beziehungstabelle haben eine andere Verwendung als eine PK. Sie sind auch Fremdschlüssel. (Außerdem stimme ich nicht zu. Wenn Sie etwas haben, das ist natürlich PK, würde ich einfach mitmachen. Wenn ich keine Einschränkungen hätte, würde ich sicherlich eines Tages widersprüchliche Einträge haben und wenn Die Einschränkung ist da, warum nicht als Primärschlüssel verwenden.)
Jan Hudec
2
Im Allgemeinen werden Pks als FKs in verschiedenen Tabellen verwendet, was Teil einer PK ist. Ich sehe keinen Widerspruch.
Idioten
1
Ich verstehe Ihre Position in Bezug auf natürliche Schlüssel, daher habe ich sorgfältig darauf geachtet, dass dies meine persönliche Präferenz ist.
Idioten
3
@ JanHudec: Dinge, die von Natur aus einzigartig sind, ändern sich auf natürliche Weise. Außerdem habe ich ziemlich oft gesehen, dass natürliche Schlüssel dazu neigen, nicht ganze Zahlen zu sein, wie Strings, was zu Leistungsproblemen führt, wenn sie als PK verwendet werden
Goran Jovic
Sie stoßen auch auf Probleme, bei denen Sie sich mit Tippfehlern in PKs befassen müssen. Es hat mich immer verrückt gemacht.
Idioten
0

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.

Jan Hudec
quelle