In meinen Datenbanken habe ich die Gewohnheit, id
für jede Tabelle, die ich erstelle , einen sich automatisch inkrementierenden, ganzzahligen Primärschlüssel mit dem Namen zu verwenden, damit ich eine eindeutige Suche nach einer bestimmten Zeile durchführen kann.
Ist das eine schlechte Idee? Gibt es irgendwelche Nachteile, wenn man es so macht? Manchmal habe ich mehrere Indizes, z. B. id, profile_id, subscriptions
wo id
die eindeutige Kennung ist, profile_id
Links zum Fremdkörper id
einer Profile
Tabelle usw.
Oder gibt es Szenarien, in denen Sie ein solches Feld nicht hinzufügen möchten?
t
und Asset 120t + 60
. Wenn Sie beide IDs (100 und 120) in unverschlüsselter Form sehen können, kennen Sie jetzt die Gesamtzahl der vorhandenen Assets sowie in etwa die Rate, mit der sie erstellt wurden. Dies ist ein Informationsleck. Dies ist nicht rein hypothetisch.Antworten:
Es ist nie eine schlechte Idee, einen garantierten eindeutigen Zeilenbezeichner zu haben. Ich denke, ich sollte nicht nie sagen - aber lassen Sie uns mit der überwiegenden Mehrheit der Zeit gehen, es ist eine gute Idee.
Zu den theoretisch möglichen Nachteilen gehören ein zusätzlicher Index für die Wartung und der zusätzliche verwendete Speicherplatz. Das war für mich noch nie Grund genug, keinen zu benutzen.
quelle
TableName.id
im gegensatz zuTableName.TableName_id
, denn woraufid
bezieht sich das sonst noch ? Wenn ich ein anderes ID-Feld in der Tabelle habe, werde ich ihm einen Tabellennamen voranstellen, wenn es sich auf eine andere Tabelle beziehtWITHOUT ROWID
Tabellen (mit einem explizitenPRIMARY KEY
) als Optimierung. Ansonsten ist eineINTEGER PRIMARY KEY
Spalte ein Alias für die Zeilen-ID.Ich bin mit allen Antworten vorher nicht einverstanden. Es gibt viele Gründe, warum es eine schlechte Idee ist, in allen Tabellen ein Auto-Inkrement-Feld hinzuzufügen.
Wenn Sie eine Tabelle haben, in der es keine offensichtlichen Schlüssel gibt, ist ein Auto-Inkrement-Feld eine gute Idee. Immerhin willst du nicht
select * from blog where body = '[10000 character string]'
. Du willst lieberselect * from blog where id = 42
. Ich würde argumentieren, dass Sie in den meisten Fällen wirklich eine eindeutige Kennung wünschen. keine fortlaufende eindeutige Kennung. Möglicherweise möchten Sie stattdessen einen universell eindeutigen Bezeichner verwenden.In den meisten Datenbanken gibt es Funktionen zum Generieren zufälliger eindeutiger Bezeichner (
uuid
in mysql, postgres.newid
In mssql). Mit diesen können Sie jederzeit Daten in mehreren Datenbanken auf verschiedenen Computern generieren, ohne dass eine Netzwerkverbindung besteht, und trotzdem Daten ohne Konflikte zusammenführen. Auf diese Weise können Sie mehrere Server und sogar Rechenzentren einfacher einrichten, z. B. mit Microservices.Dadurch wird auch vermieden, dass Angreifer URLs zu Seiten erraten, auf die sie keinen Zugriff haben sollten. Wenn es eine
https://example.com/user/1263
gibt, gibt es wahrscheinlich auch einehttps://example.com/user/1262
. Dies könnte die Automatisierung eines Sicherheits-Exploits auf der Benutzerprofilseite ermöglichen.Es gibt auch viele Fälle, in denen eine uuid-Spalte unbrauchbar oder sogar schädlich ist. Nehmen wir an, Sie haben ein soziales Netzwerk. Es gibt einen
users
Tisch und einenfriends
Tisch. Die Freundes-Tabelle enthält zwei Benutzer-ID-Spalten und ein Auto-Inkrement-Feld. Sie möchten3
mit befreundet sein5
, so dass Sie3,5
in die Datenbank einfügen . Die Datenbank fügt eine Auto-Inkrement-ID hinzu und speichert diese1,3,5
. Irgendwie3
klickt der Benutzer erneut auf den "Freund hinzufügen" -Button. Wenn Sie erneut3,5
in die Datenbank einfügen , fügt die Datenbank eine Auto-Inkrement-ID hinzu und fügt sie ein2,3,5
. Aber jetzt3
und5
sind zweimal miteinander befreundet! Das ist Platzverschwendung, und wenn Sie darüber nachdenken, ist dies auch die Spalte für die automatische Inkrementierung. Alles was Sie brauchen, um zu sehen, oba
undb
are friends ist für die Zeile mit diesen beiden Werten auszuwählen. Sie sind zusammen eine eindeutige Zeilenkennung. (Sie wollen wahrscheinlich eine gewisse Logik zu tun , schreiben , um sicherzustellen ,3,5
und5,3
werden dedupliziert.)Es gibt immer noch Fälle, in denen sequentielle IDs nützlich sein können, wie beim Erstellen eines URL-Kürzers, aber meistens (und sogar mit dem URL-Kürzer) möchten Sie stattdessen eine zufällig generierte eindeutige ID verwenden.
TL; DR: Verwenden Sie UUIDs anstelle der automatischen Inkrementierung, wenn Sie nicht bereits eine eindeutige Methode zur Identifizierung jeder Zeile haben.
quelle
Autoincemental-Schlüssel haben meistens Vorteile.
Einige mögliche Nachteile könnten jedoch sein:
Hier ist ein Wikipedia-Artikel über die Nachteile von Ersatzschlüsseln.
quelle
Nein, Sie müssen NICHT immer einen numerischen AutoInc-PK haben.
Wenn Sie Ihre Daten sorgfältig analysieren, identifizieren Sie häufig natürliche Schlüssel in den Daten. Dies ist häufig der Fall, wenn die Daten für das Unternehmen eine intrinsische Bedeutung haben. Manchmal sind die PKs Artefakte aus alten Systemen, die die Geschäftsbenutzer als zweite Sprache verwenden, um Attribute ihres Systems zu beschreiben. Ich habe Fahrzeug-VIN-Nummern gesehen, die beispielsweise als Primärschlüssel einer "Fahrzeug" -Tabelle in einem Flottenmanagementsystem verwendet werden.
Wenn Sie jedoch bereits eine eindeutige Kennung haben, verwenden Sie diese. Erstellen Sie keinen zweiten, bedeutungslosen Primärschlüssel. Es ist verschwenderisch und kann Fehler verursachen.
Manchmal können Sie eine AutoInc-PK verwenden, um einen für den Kunden aussagekräftigen Wert zu generieren, z. B. Richtliniennummern. Setzen Sie den Startwert auf einen sinnvollen Wert und wenden Sie Geschäftsregeln für führende Nullen usw. an. Dies ist wahrscheinlich ein Ansatz, der das Beste aus zwei Welten ist.
Wenn Sie eine geringe Anzahl von Werten haben, die relativ statisch sind, verwenden Sie Werte, die für den Systembenutzer sinnvoll sind. Warum sollten Sie 1,2,3 verwenden, wenn Sie L, C, H verwenden könnten, wobei L, H und C für Leben, Auto und Privat in einem Versicherungskontext vom Typ "Versicherungsvertrag" stehen, oder, um auf das VIN-Beispiel zurückzukommen, wie wäre es mit "TO"? "für Toyota? Alle Toyata-Fahrzeuge haben eine Fahrgestellnummer, die mit "TO" beginnt. Dies ist eine Sache, an die sich die Benutzer weniger erinnern müssen, und die die Wahrscheinlichkeit verringert, dass sie Programmier- und Benutzerfehler einführen. Sie können sogar als Ersatz für eine vollständige Beschreibung in Managementberichten verwendet werden, um die Berichte zu vereinfachen zu schreiben und vielleicht schneller zu generieren.
Eine Weiterentwicklung davon ist wahrscheinlich "eine Brücke zu weit", und ich empfehle es im Allgemeinen nicht, aber ich beziehe es der Vollständigkeit halber ein, und Sie finden möglicherweise eine gute Verwendung dafür. Verwenden Sie also die Beschreibung als Primärschlüssel. Für sich schnell ändernde Daten ist dies ein Gräuel. Für sehr statische Daten, die bei All The Time gemeldet werden , ist dies möglicherweise nicht der Fall. Ich erwähne es nur, damit es dort als eine Möglichkeit sitzt.
Ich benutze zwar AutoInc-PKs, aber ich beschäftige mich nur mit meinem Gehirn und suche zuerst nach besseren Alternativen. Die Kunst des Datenbankdesigns macht etwas Sinnvolles, das schnell abgefragt werden kann. Zu viele Joins behindern dies.
BEARBEITEN Ein weiterer wichtiger Fall, in dem Sie keine automatisch generierte PK benötigen, sind Tabellen, die die Schnittmenge zweier anderer Tabellen darstellen. Um bei der Auto-Analogie zu bleiben, hat ein Auto 0..n Zubehörteile. Jedes Zubehörteil ist bei vielen Autos vorhanden. Um dies darzustellen, erstellen Sie eine Car_Accessory-Tabelle, die die PKs von Car and Accessory und andere relevante Informationen über den Link Dates etc. enthält.
Was Sie (normalerweise) nicht benötigen, ist ein AutoInc PK auf diesem Tisch - auf diesen kann nur über das Auto zugegriffen werden.
quelle
Don't create a second, meaningless primary key; it's wasteful and may cause errors.
Wenn die Art und Weise, wie Sie die Eindeutigkeit eines Datensatzes herstellen, aus einer Kombination von 6 Spalten besteht, ist die ständige Verknüpfung aller 6 Spalten sehr fehleranfällig. Die Daten haben natürlich eine PK, aber es ist besser, eineid
Spalte und eine eindeutige Einschränkung für diese 6 Spalten zu verwenden.Viele Tabellen haben bereits eine natürliche eindeutige ID. Fügen Sie diesen Tabellen keine weitere eindeutige ID-Spalte (automatische Inkrementierung oder auf andere Weise) hinzu. Verwenden Sie stattdessen die natürliche eindeutige ID. Wenn Sie eine weitere eindeutige ID hinzufügen, haben Sie im Wesentlichen eine Redundanz (Duplizierung oder Abhängigkeit) in Ihren Daten. Dies widerspricht den Grundsätzen der Normalisierung. Eine eindeutige ID ist für die Genauigkeit von der anderen abhängig. Das bedeutet , dass sie sich perfekt an synchron gehalten werden müssen jederzeit in jedem System , das diese Zeilen verwaltet. Es ist nur eine weitere Schwachstelle in Ihrer Datenintegrität, die Sie nicht wirklich langfristig verwalten und validieren müssen möchten.
Die meisten Tabellen benötigen heutzutage nicht wirklich die sehr geringe Leistungssteigerung, die eine zusätzliche eindeutige ID-Spalte bieten würde (und manchmal beeinträchtigt dies sogar die Leistung). Vermeiden Sie Redundanzen wie die Pest! Widersetze dich überall dort, wo es dir vorgeschlagen wird. Es ist Anathema. Und beachten Sie das Zitat. Alles sollte so einfach wie möglich sein, aber nicht einfacher. Haben Sie keine zwei eindeutigen IDs, bei denen eine ausreicht, auch wenn die natürliche weniger aufgeräumt zu sein scheint.
quelle
Bei größeren Systemen ist ID ein Konsistenzverbesserer. Verwenden Sie es fast überall. In diesem Zusammenhang werden einzelne Primärschlüssel NICHT empfohlen, sie sind im Endeffekt teuer (lesen Sie, warum).
Jede Regel hat eine Ausnahme. Daher benötigen Sie möglicherweise keine automatische Inkrementierungs-ID für Ganzzahlen für Staging-Tabellen, die für den Export / Import verwendet werden, sowie für ähnliche Einweg- oder temporäre Tabellen. Sie würden auch GUIDs anstelle von IDs auf verteilten Systemen bevorzugen.
Viele Antworten hier deuten darauf hin, dass ein vorhandener eindeutiger Schlüssel verwendet werden sollte. Na auch wenn es 150 Zeichen hat? Ich glaube nicht
Nun mein Hauptpunkt:
Es sieht so aus, als würden Gegner von autoincrement integer ID von kleinen Datenbanken mit bis zu 20 Tabellen sprechen. Dort können sie sich einen individuellen Zugang zu jedem Tisch leisten.
ABER wenn Sie ein ERP mit mehr als 400 Tabellen haben, ist es einfach sehr sinnvoll, überall (mit Ausnahme der oben genannten Fälle) eine ganzzahlige Autoincrement-ID zu haben . Sie verlassen sich nicht auf andere eindeutige Felder, auch wenn diese vorhanden und für die Eindeutigkeit gesichert sind.
JOIN
Tabellen, ohne zu überprüfen, was die Schlüssel sind.Auf größeren Systemen kann es sich lohnen, die geringfügigen Vorteile dieser einzelnen Primärschlüssel zu ignorieren und in den meisten Fällen die ganzzahlige Autoincrement-ID zu verwenden. Durch die Verwendung vorhandener eindeutiger Felder als Primärschlüssel werden möglicherweise einige Bytes pro Datensatz gespart, aber zusätzliche Speicher- oder Indizierungszeiten sind in den heutigen Datenbankmodulen kein Problem . Tatsächlich verlieren Sie viel mehr Geld und Ressourcen durch verschwendete Zeit der Entwickler / Betreuer. Die heutige Software sollte für den Zeit- und Arbeitsaufwand von Programmierern optimiert werden - welcher Ansatz mit konsistenten IDs besser erfüllt wird.
quelle
Es ist keine gute Praxis, überflüssige Designs zu verwenden. Dh, es ist nicht ratsam, immer einen Auto-Inkrement-Int-Primärschlüssel zu haben, wenn einer nicht benötigt wird.
Schauen wir uns ein Beispiel an, bei dem eines nicht benötigt wird.
Sie haben eine Tabelle für Artikel - diese hat einen int-Primärschlüssel
id
und eine varchar-Spalte mit dem Namentitle
.Sie haben auch eine Tabelle mit Artikelkategorien -
id
int Primärschlüssel, varcharname
.Eine Zeile in der Artikeltabelle hat eine
id
5 und einetitle
"Wie man Gans mit Butter kocht". Sie möchten diesen Artikel mit den folgenden Zeilen in Ihrer Kategorietabelle verknüpfen: "Geflügel" ( ID : 20), "Gans" ( ID : 12), "Kochen" ( ID : 2), "Butter" (ID: 9) .Jetzt haben Sie 2 Tabellen: Artikel und Kategorien. Wie stellen Sie die Beziehung zwischen den beiden her?
Sie könnten eine Tabelle mit 3 Spalten haben: id (Primärschlüssel), article_id (Fremdschlüssel), category_id (Fremdschlüssel). Aber jetzt haben Sie etwas wie:
Eine bessere Lösung besteht darin, einen Primärschlüssel zu haben, der aus 2 Spalten besteht.
Dies kann folgendermaßen erreicht werden:
Ein weiterer Grund, keine Ganzzahl mit automatischer Inkrementierung zu verwenden, besteht darin, dass Sie UUIDs für Ihren Primärschlüssel verwenden.
UUIDs sind ihrer Definition nach eindeutig, was dasselbe bewirkt wie die Verwendung eindeutiger Ganzzahlen. Sie haben auch ihre eigenen zusätzlichen Vorteile (und Nachteile) gegenüber ganzen Zahlen. Mit einer UUID wissen Sie beispielsweise, dass die eindeutige Zeichenfolge, auf die Sie sich beziehen, auf einen bestimmten Datensatz verweist. Dies ist nützlich, wenn Sie nicht über eine zentrale Datenbank verfügen oder wenn Anwendungen die Möglichkeit haben, Datensätze offline zu erstellen (und sie zu einem späteren Zeitpunkt in die Datenbank hochzuladen).
Am Ende müssen Sie nicht über Primärschlüssel nachdenken. Sie müssen sich diese als die Funktion vorstellen, die sie ausführen. Warum brauchen Sie Primärschlüssel? Um bestimmte Datensätze aus einer Tabelle anhand eines Feldes eindeutig identifizieren zu können, das in Zukunft nicht mehr geändert wird. Benötigen Sie dazu eine bestimmte Spalte
id
oder können Sie diese eindeutige Identifikation auf andere (unveränderliche) Daten stützen?quelle
Sicher.
Erstens gibt es Datenbanken, die keine automatischen Zuwächse aufweisen (z. B. Oracle, das mit Sicherheit nicht zu den kleinsten Konkurrenten zählt). Dies sollte ein erster Hinweis darauf sein, dass nicht jeder sie mag oder braucht.
Noch wichtiger ist, überlegen Sie, wie die ID tatsächlich lautet - sie ist ein Primärschlüssel für Ihre Daten. Wenn Sie eine Tabelle mit einem anderen Primärschlüssel haben, benötigen Sie keine ID und sollten auch keine haben. Beispielsweise hat eine Tabelle
(EMPLOYEE_ID, TEAM_ID)
(in der sich jeder Mitarbeiter gleichzeitig in mehreren Teams befinden kann) einen klar definierten Primärschlüssel, der aus diesen beiden IDs besteht. Das Hinzufügen einer Autoincrement-ID
Spalte, die auch ein Primärschlüssel für diese Tabelle ist, macht überhaupt keinen Sinn. Jetzt schleppen Sie 2 Primärschlüssel herum und das erste Wort in "Primärschlüssel" sollte Ihnen einen Hinweis geben, dass Sie wirklich nur einen haben sollten.quelle
Normalerweise verwende ich eine "Identität" -Spalte (automatisch inkremenntierende Ganzzahl), wenn ich neue Tabellen für "langlebige" Daten definiere (Datensätze, die ich voraussichtlich einmal einfügen und unbegrenzt aufbewahren werde, auch wenn sie durch Setzen eines Bitfelds "logisch gelöscht" werden ).
Es gibt einige Situationen, an die ich denken kann, wenn Sie sie nicht verwenden möchten. Die meisten ergeben sich aus Szenarien, in denen eine Tabelle in einer Instanz der Datenbank nicht die maßgebliche Quelle für neue ID-Werte sein kann:
Wie ich hoffentlich erwähnt habe, gibt es Problemumgehungen, die die Verwendung von Identitätsspalten in diesen Situationen ermöglichen. In den meisten Fällen ist das Upgrade von der ganzzahligen Identitätsspalte auf eine GUID jedoch einfacher und löst das Problem vollständiger.
quelle
ID, ID_M, ID_N
) weiterhin benötigen können, weil Sie Eigenschaften an Instanzen Ihrer M: N-Beziehung anhängen.Ein automatisch inkrementierter (Identitäts-) Primärschlüssel ist eine gute Idee, mit der Ausnahme, dass er außerhalb des Kontexts der Datenbank und der unmittelbaren Clients dieser Datenbank bedeutungslos ist. Wenn Sie zum Beispiel einige Daten in eine andere Datenbank übertragen und dort speichern und dann unterschiedliche Daten in beide Datenbanktabellen schreiben, weichen die IDs voneinander ab, dh Daten mit der ID 42 in einer Datenbank stimmen nicht unbedingt mit den Daten überein mit einer ID von 42 in der anderen.
Wenn es dennoch erforderlich ist, Zeilen außerhalb der Datenbank eindeutig zu identifizieren (und dies ist häufig der Fall), müssen Sie für diesen Zweck einen anderen Schlüssel haben. Ein sorgfältig ausgewählter Geschäftsschlüssel reicht aus, Sie werden jedoch häufig eine große Anzahl von Spalten benötigen, um die Eindeutigkeit zu gewährleisten. Eine andere Methode besteht darin, eine ID-Spalte als automatisch inkrementierten geclusterten Primärschlüssel und eine andere eindeutige Kennung (GUID) als nicht geclusterten eindeutigen Schlüssel zu verwenden, um die Zeile eindeutig zu identifizieren, wo immer sie auf der Welt vorhanden ist. Der Grund, warum Sie in diesem Fall immer noch über einen automatisch inkrementierten Schlüssel verfügen, besteht darin, dass es effizienter ist, den automatisch inkrementierenden Schlüssel zu gruppieren und zu indizieren, als dies mit einer Guid zu tun.
Ein Fall, in dem Sie möglicherweise keinen automatisch inkrementierenden Schlüssel wünschen, ist eine Viele-zu-Viele-Tabelle, in der der Primärschlüssel eine Verbindung der ID-Spalten von zwei anderen Tabellen ist (Sie könnten hier immer noch einen automatisch inkrementierenden Schlüssel haben, aber ich verstehe den Sinn nicht).
Eine andere Frage ist der Datentyp des automatisch inkrementierten Schlüssels. Mit einem Int32 erhalten Sie einen großen, aber relativ begrenzten Wertebereich. Persönlich verwende ich häufig Bigint-Spalten für die ID, um praktisch nie befürchten zu müssen, dass die Werte ausgehen.
quelle
Da andere den Fall eines inkrementierenden Primärschlüssels vertreten haben, werde ich einen für eine GUID erstellen:
Bearbeiten: Punkt duplizieren
quelle
Grundsätzlich sollte jede Tabelle eine zuverlässige Methode haben, um eine Zeile eindeutig zu identifizieren. Ein Primärschlüssel ist dafür zwar gedacht, erfordert jedoch nicht immer die Existenz eines Primärschlüssels. Das Hinzufügen eines Primärschlüssels zu jeder Tabelle ist keine schlechte Vorgehensweise, da hierdurch eine eindeutige Zeilenidentifikation möglich ist, dies ist jedoch möglicherweise nicht erforderlich.
Um zuverlässige Beziehungen zwischen den Zeilen von zwei oder mehr Tabellen aufrechtzuerhalten, müssen Sie dies über Fremdschlüssel tun, weshalb in mindestens einigen Tabellen Primärschlüssel erforderlich sind. Das Hinzufügen eines Primärschlüssels zu jeder Tabelle erleichtert das Erweitern des Datenbankentwurfs, wenn neue Tabellen oder Beziehungen zu vorhandenen Daten hinzugefügt werden müssen. Vorausplanung ist immer eine gute Sache.
Grundsätzlich (harte Regel vielleicht) sollte sich der Wert eines Primärschlüssels während der gesamten Lebensdauer seiner Zeile nicht ändern. Es ist ratsam anzunehmen, dass sich alle Geschäftsdaten in einer Reihe im Laufe ihrer Lebensdauer ändern. Daher sind alle Geschäftsdaten ein schlechter Kandidat für einen Primärschlüssel. Aus diesem Grund ist etwas Abstraktes wie eine automatisch inkrementierte Ganzzahl oft eine gute Idee. Automatisch inkrementierte Ganzzahlen haben jedoch ihre Grenzen.
Wenn Ihre Daten nur in Ihrer Datenbank gespeichert sind, sind automatisch inkrementierte Ganzzahlen in Ordnung. Wie in anderen Antworten bereits erwähnt, führen automatisch inkrementierte Ganzzahlen jedoch zu schlechten Primärschlüsseln, wenn Sie möchten, dass Ihre Daten freigegeben, synchronisiert oder auf andere Weise außerhalb Ihrer Datenbank gespeichert werden. Eine bessere Wahl ist eine Guid (auch bekannt als "universell eindeutige ID").
quelle
Die Frage und viele der Antworten übersehen den wichtigen Punkt, dass sich alle natürlichen Schlüssel für jede Tabelle ausschließlich im logischen Schema für die Datenbank und alle Ersatzschlüssel für jede Tabelle ausschließlich im physischen Schema für die Datenbank befinden. In anderen Antworten werden nur die relativen Vorteile von ganzzahligen gegenüber GUID-Ersatzschlüsseln erörtert, ohne die Gründe für die ordnungsgemäße Verwendung von Ersatzschlüsseln zu erläutern.
Übrigens: Vermeiden wir die Verwendung des schlecht definierten und ungenauen Begriffs Primärschlüssel . Es ist ein Artefakt vorrelationaler Datenmodelle, das zuerst (unklug) in das relationale Modell übernommen und dann von verschiedenen RDBMS-Anbietern wieder in den physischen Bereich übernommen wurde. Seine Verwendung dient nur dazu, die Semantik zu verwirren.
Beachten Sie aus dem relationalen Modell, dass jede Tabelle eine vom Benutzer sichtbare Gruppe von Feldern haben muss, die als natürlicher Schlüssel bezeichnet werden und jede Zeile der Tabelle eindeutig identifizieren , damit das logische Datenbankschema die erste normale Form aufweist . In den meisten Fällen ist ein solcher natürlicher Schlüssel leicht zu identifizieren, aber gelegentlich muss ein solcher Schlüssel konstruiert werden, sei es als ein Gleichstandsfeld oder auf andere Weise. Ein solcher konstruierter Schlüssel ist jedoch immer noch für den Benutzer sichtbar und befindet sich daher immer im logischen Schema der Datenbank.
Im Gegensatz dazu befindet sich jeder Ersatzschlüssel in einer Tabelle ausschließlich im physischen Schema der Datenbank (und muss daher sowohl aus Sicherheitsgründen als auch zur Aufrechterhaltung der Datenbankintegrität für Datenbankbenutzer vollständig unsichtbar sein). Der einzige Grund für die Einführung eines Ersatzschlüssels ist die Behebung von Leistungsproblemen bei der physischen Wartung und Verwendung der Datenbank. ob es sich dabei um Joins, Replikationen, mehrere Hardwarequellen für Daten oder andere handelt.
Da der einzige Grund für die Einführung eines Ersatzschlüssels die Leistung ist, nehmen wir an, dass wir möchten, dass er performant ist. Wenn das vorliegende Leistungsproblem Joins ist, möchten wir unseren Ersatzschlüssel unbedingt so eng wie möglich gestalten (ohne die Hardware zu beeinträchtigen, sodass in der Regel kurze Ganzzahlen und Bytes herauskommen). Die Join-Leistung hängt von der minimalen Indexhöhe ab, daher ist eine 4-Byte-Ganzzahl eine natürliche Lösung. Wenn Ihr Leistungsproblem die Einfügerate ist, kann eine 4-Byte-Ganzzahl auch eine natürliche Lösung sein (abhängig von den internen Merkmalen Ihres RDBMS). Wenn Ihr Leistungsproblem für eine Tabelle die Replikation oder mehrere Datenquellen als eine andere Ersatzschlüsseltechnologie ist, ist möglicherweise eine GUID oder ein zweiteiliger Schlüssel (Host-ID + Ganzzahl) besser geeignet. Ich persönlich bin kein Favorit von GUIDs, aber sie sind praktisch.
Zusammenfassend lässt sich sagen, dass nicht alle Tabellen einen Ersatzschlüssel (von beliebigem Typ) erfordern . Sie sollten nur verwendet werden, wenn dies für die Leistung der betreffenden Tabelle als notwendig erachtet wird. Unabhängig davon, welche gängige Ersatzschlüssel- Technologie Sie bevorzugen, sollten Sie die tatsächlichen Anforderungen der Tabelle sorgfältig abwägen, bevor Sie eine Auswahl treffen. Das Ändern der Wahl der Ersatzschlüssel- Technologie für einen Tisch wird anstrengend sein. Dokumentieren Sie die Hauptleistungsmetrik für Ihre Tabelle, damit Ihre Nachfolger die getroffenen Entscheidungen verstehen.
Sonderfälle
Wenn Ihre Geschäftsanforderungen eine fortlaufende Nummerierung von Transaktionen für Prüfzwecke (oder andere) Zwecke erfordern, ist dieses Feld kein Ersatzschlüssel. Es ist ein natürlicher Schlüssel (mit zusätzlichen Anforderungen). Aus der Dokumentation geht hervor, dass eine automatisch inkrementierende Ganzzahl nur Ersatzschlüssel generiert. Suchen Sie daher nach einem anderen Mechanismus, um diese zu generieren. Offensichtlich ist eine Art Monitor erforderlich, und wenn Sie Ihre Transaktionen von mehreren Standorten aus beziehen, ist ein Standort ein besonderer Standort, da er als Host-Standort für den Monitor festgelegt ist.
Wenn Ihre Tabelle niemals mehr als 100 Zeilen enthält, ist die Indexhöhe irrelevant. Jeder Zugriff erfolgt über einen Tabellenscan. Allerdings sind Zeichenfolgenvergleiche für lange Zeichenfolgen immer noch viel teurer als der Vergleich einer 4-Byte-Ganzzahl und teurer als der Vergleich einer GUID.
Eine Tabelle der Codewert durch ein verkeilte char (4) Code - Feld sollte als performante als eines mit einer 4-Byte - Ganzzahl sein. Obwohl ich keinen Beweis dafür habe, verwende ich die Annahme häufig und hatte nie Grund, sie zu bereuen.
quelle
Es ist nicht nur keine gute Praxis, sondern wird in Bill Karwins SQL Antipatterns-Buch auch als Anti-Pattern beschrieben.
Nicht jede Tabelle benötigt einen Pseudoschlüssel - einen Primärschlüssel mit einem beliebigen Wert, der keinen semantischen Wert für das Modell hat - und es gibt keinen Grund, ihn immer aufzurufen
id
.quelle
Dies ist ziemlich universell - ansonsten müssten Sie überprüfen, ob der Schlüssel tatsächlich eindeutig ist. Dies würde durch einen Blick auf alle anderen Schlüssel geschehen ... was zeitaufwändig wäre. Ein inkrementeller Schlüssel wird teuer, wenn sich Ihre Datensatznummer dem Wert für den Schlüsselüberlauf nähert.
Normalerweise mache ich die Zeiger offensichtlicher wie Feldnamen
ref_{table}
oder ähnliche Idee.Wenn es nicht erforderlich ist, extern auf einen Datensatz zu verweisen, benötigen Sie keine ID.
quelle
unsigned int
für den Feldtyp verwenden, da sonst die Hälfte dieser Anzahl überschritten wird.Ich würde nicht sagen, dass es immer getan werden sollte. Ich habe hier einen Tisch ohne eindeutigen Schlüssel - und er benötigt keinen. Es ist ein Überwachungsprotokoll. Es wird nie ein Update geben, Abfragen geben alle Änderungen an dem zurück, was protokolliert wird, aber das ist das Beste, was vernünftigerweise getan werden kann, um eine fehlerhafte Änderung zu definieren. (Wenn der Code es könnte, hätte er ihn überhaupt nicht zugelassen!)
quelle
Ein automatischer Inkrementzähler für einen Primärschlüssel ist keine gute Idee. Das liegt daran, dass Sie zur Datenbank zurückkehren müssen, um den nächsten Schlüssel zu finden und diesen vor dem Einfügen Ihrer Daten um eins zu erhöhen.
Abgesehen davon würde ich im Allgemeinen alles verwenden, was die Datenbank für den Primärschlüssel bereitstellen kann, anstatt ihn als Teil der Anwendung zu haben.
Indem Sie die Datenbank nativ zur Verfügung stellen, kann sichergestellt werden, dass der Schlüssel für die Anforderungen eindeutig ist.
Natürlich unterstützen es nicht alle Datenbanken. In diesem Fall verwende ich im Allgemeinen eine Tabelle, in der Schlüsselbereiche gespeichert werden, und verwende hohe und niedrige Bereiche, die in der Anwendung verwaltet werden. Dies ist die leistungsstärkste Lösung, die ich finde, da Sie einen Bereich von 10000 Zahlen erhalten und diese in der Anwendungsinstanz automatisch inkrementieren. Eine andere Anwendungsinstanz kann einen anderen Bereich von Zahlen abrufen, mit denen gearbeitet werden soll. Sie benötigen ein ausreichend großes Primärschlüssel-Primitiv, z. B. ein 64-Bit-Long.
UUIDs werden nicht als Primärschlüssel verwendet, da die Kosten für das Erstellen und Speichern der UUIDs viel höher sind als das Inkrementieren eines langen Werts um eins. UUIDs beschäftigen sich immer noch mit dem Geburtstagsparadox, da theoretisch ein Duplikat entstehen kann.
quelle