Ich erstelle eine Datenbanktabelle und habe keinen logischen Primärschlüssel zugewiesen. Also denke ich darüber nach, es ohne Primärschlüssel zu lassen, aber ich fühle mich ein bisschen schuldig. Sollte ich?
Sollte jede Tabelle einen Primärschlüssel haben?
database
database-design
Daniel Silveira
quelle
quelle
Antworten:
Kurze Antwort: ja .
Lange Antwort:
In MySQL erstellt die InnoDB-Speicher-Engine immer einen Primärschlüssel, wenn Sie ihn nicht explizit angegeben haben, sodass eine zusätzliche Spalte erstellt wird, auf die Sie keinen Zugriff haben.
Beachten Sie, dass ein Primärschlüssel zusammengesetzt sein kann.
Wenn Sie eine Viele-zu-Viele-Verknüpfungstabelle haben, erstellen Sie den Primärschlüssel für alle an der Verknüpfung beteiligten Felder. So stellen Sie sicher, dass Sie nicht zwei oder mehr Datensätze haben, die einen Link beschreiben.
Neben den logischen Konsistenzproblemen profitieren die meisten RDBMS-Engines davon, diese Felder in einen eindeutigen Index aufzunehmen.
Und da für jeden Primärschlüssel ein eindeutiger Index erstellt werden muss, sollten Sie ihn deklarieren und sowohl logische Konsistenz als auch Leistung erzielen.
In diesem Artikel in meinem Blog erfahren Sie, warum Sie immer einen eindeutigen Index für eindeutige Daten erstellen sollten:
PS Es gibt einige sehr, sehr spezielle Fälle, in denen Sie keinen Primärschlüssel benötigen.
Meistens enthalten sie Protokolltabellen, die aus Leistungsgründen keine Indizes haben .
quelle
Immer am besten einen Primärschlüssel haben. Auf diese Weise entspricht es der ersten Normalform und ermöglicht es Ihnen, den Pfad der Datenbanknormalisierung fortzusetzen .
Wie von anderen angegeben, gibt es einige Gründe, keinen Primärschlüssel zu haben, aber die meisten werden nicht beschädigt, wenn es einen Primärschlüssel gibt
quelle
So ziemlich jedes Mal, wenn ich eine Tabelle ohne Primärschlüssel erstellt habe und dachte, ich würde keinen brauchen, bin ich zurückgegangen und habe einen hinzugefügt. Ich erstelle jetzt sogar meine Join-Tabellen mit einem automatisch generierten Identitätsfeld, das ich als Primärschlüssel verwende.
quelle
Mit Ausnahme einiger sehr seltener Fälle (möglicherweise einer Viele-zu-Viele-Beziehungstabelle oder einer Tabelle, die Sie vorübergehend zum Massenladen großer Datenmengen verwenden) würde ich dem Sprichwort folgen:
Marc
quelle
Müssen Sie diese Tabelle jemals mit anderen Tabellen verbinden? Benötigen Sie eine Möglichkeit, einen Datensatz eindeutig zu identifizieren? Wenn die Antwort Ja lautet, benötigen Sie einen Primärschlüssel. Angenommen, Ihre Daten sind so etwas wie eine Kundentabelle, die die Namen der Personen enthält, die Kunden sind. Möglicherweise gibt es keinen natürlichen Schlüssel, da Sie die Adressen, E-Mails, Telefonnummern usw. benötigen, um festzustellen, ob sich diese Sally Smith von der Sally Smith unterscheidet, und Sie diese Informationen in verwandten Tabellen speichern, da die Person mehrere Telefone und Adressen haben kann Angenommen, Sally Smith heiratet John Jones und wird Sally Jones. Wenn Sie keinen künstlichen Schlüssel auf dem Tisch haben, haben Sie beim Aktualisieren des Namens nur 7 Sally Smiths in Sally Jones geändert, obwohl nur einer von ihnen geheiratet und ihren Namen geändert hat.
Sie sagen, Sie haben keinen natürlichen Schlüssel, daher haben Sie auch keine Feldkombinationen, die Sie eindeutig machen könnten. Dies macht den künstlichen Schlüssel kritisch.
Ich habe immer dann festgestellt, dass ein künstlicher Schlüssel ein absolutes Muss für die Aufrechterhaltung der Datenintegrität ist, wenn ich keinen natürlichen Schlüssel habe. Wenn Sie einen natürlichen Schlüssel haben, können Sie diesen stattdessen als Schlüsselfeld verwenden. Aber ich persönlich bevorzuge immer noch einen künstlichen Schlüssel und einen eindeutigen Index für den natürlichen Schlüssel, es sei denn, der natürliche Schlüssel ist ein Feld. Sie werden es später bereuen, wenn Sie keine eingeben.
quelle
Fügen Sie es einfach hinzu, es wird Ihnen später leid tun, wenn Sie es nicht getan haben (Auswählen, Löschen, Verknüpfen usw.)
quelle
Es ist eine gute Praxis, an jedem Tisch eine PK zu haben, aber es ist kein MUSS. Höchstwahrscheinlich benötigen Sie einen eindeutigen Index und / oder einen Clustered-Index (PK oder nicht), je nach Bedarf.
Lesen Sie die Abschnitte Primärschlüssel und Clustered-Indizes in Books Online (für SQL Server).
" PRIMARY KEY-Einschränkungen identifizieren die Spalte oder den Satz von Spalten mit Werten, die eine Zeile in einer Tabelle eindeutig identifizieren. Keine zwei Zeilen in einer Tabelle können denselben Primärschlüsselwert haben. Sie können für keine Spalte in einem Primärschlüssel NULL eingeben. Wir empfehlen die Verwendung einer kleinen ganzzahligen Spalte als Primärschlüssel. Jede Tabelle sollte einen Primärschlüssel haben. Eine Spalte oder Kombination von Spalten, die als Primärschlüsselwert gelten, wird als Kandidatenschlüssel bezeichnet. "
Aber dann sehen Sie sich das auch an: http://www.aisintl.com/case/primary_and_foreign_key.html
quelle
Stimmen Sie der vorgeschlagenen Antwort nicht zu. Die kurze Antwort lautet: NEIN .
Der Primärschlüssel dient dazu, eine Zeile in der Tabelle eindeutig zu identifizieren, um eine Beziehung zu einer anderen Tabelle herzustellen. Traditionell wird zu diesem Zweck ein automatisch inkrementierter ganzzahliger Wert verwendet, aber es gibt Variationen davon.
Es gibt jedoch Fälle, in denen beispielsweise Zeitreihendaten protokolliert werden, in denen das Vorhandensein eines solchen Schlüssels einfach nicht benötigt wird und nur Speicherplatz beansprucht. Eine Zeile einzigartig zu machen ist einfach ... nicht erforderlich!
Ein kleines Beispiel: Tabelle A: LogData
Kein Primärschlüssel erforderlich.
Tabelle B: Benutzer
Primärschlüssel (ID) erforderlich, um als "Fremdschlüssel" für die LogData-Tabelle verwendet zu werden.
quelle
Ich weiß, dass Sie zur Verwendung bestimmter Funktionen der Rasteransicht in .NET einen Primärschlüssel benötigen, damit die Rasteransicht weiß, welche Zeile aktualisiert / gelöscht werden muss. Die allgemeine Praxis sollte darin bestehen, einen Primärschlüssel oder einen Primärschlüsselcluster zu haben. Ich persönlich bevorzuge das erstere.
quelle
Um es zukunftssicher zu machen, sollten Sie es wirklich tun. Wenn Sie es replizieren möchten, benötigen Sie eine. Wenn Sie es an einen anderen Tisch bringen möchten, wird Ihr Leben (und das der armen Narren, die es nächstes Jahr pflegen müssen) so viel einfacher.
quelle
Ich habe immer einen Primärschlüssel, auch wenn ich am Anfang noch keinen Zweck dafür habe. Es gab einige Male, in denen ich irgendwann eine PK in einer Tabelle brauchte, die keine hat, und es ist immer schwieriger, sie später einzufügen. Ich denke, es ist eher ein Vorteil, immer einen einzubeziehen.
quelle
Ich bin in der Rolle der Pflege der vom Offshore-Entwicklungsteam erstellten Anwendung. Jetzt habe ich alle möglichen Probleme in der Anwendung, da das ursprüngliche Datenbankschema in einigen Tabellen keine PRIMARY KEYS enthielt. Lassen Sie also bitte andere Menschen nicht unter Ihrem schlechten Design leiden. Es ist immer eine gute Idee, Primärschlüssel in Tabellen zu haben.
quelle
Kurz gesagt, nein. Sie müssen jedoch berücksichtigen, dass bestimmte Clientzugriffs-CRUD-Vorgänge dies erfordern. Für die Zukunftssicherung verwende ich immer Primärschlüssel.
quelle
Wenn Sie den Ruhezustand verwenden, ist es nicht möglich, eine Entität ohne Primärschlüssel zu erstellen. Dieses Problem kann zu Problemen führen, wenn Sie mit einer vorhandenen Datenbank arbeiten, die mit einfachen SQL / DDL-Skripten erstellt wurde und kein Primärschlüssel hinzugefügt wurde
quelle