413 Stimmen

Sollte jede einzelne Tabelle einen Primärschlüssel haben?

Ich erstelle eine Datenbanktabelle und habe ihr keinen logischen Primärschlüssel zugewiesen. Sollte jede einzelne Tabelle einen Primärschlüssel haben?

364voto

Quassnoi Punkte 396418

Kurze Antwort: ja .

Lange Antwort:

  • Sie müssen Ihre Tabelle mit etwas verbinden können
  • Wenn Sie wollen, dass Ihre Tabelle geclustert wird, brauchen Sie eine Art Primärschlüssel.
  • Wenn Ihr Tabellendesign keinen Primärschlüssel benötigt, überdenken Sie Ihr Design: Wahrscheinlich fehlt Ihnen etwas. Warum identische Datensätze behalten?

In MySQL erstellt die InnoDB-Speicher-Engine immer einen Primärschlüssel, wenn Sie ihn nicht explizit angegeben haben, wodurch eine zusätzliche Spalte entsteht, auf die Sie keinen Zugriff haben.

Beachten Sie, dass ein Primärschlüssel zusammengesetzt sein kann.

Wenn Sie eine Many-to-many-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 eine Verknüpfung beschreiben.

Abgesehen von den logischen Konsistenzproblemen ist es für die meisten RDBMS-Engines von Vorteil, diese Felder in einen eindeutigen Index aufzunehmen.

Da für jeden Primärschlüssel ein eindeutiger Index erstellt werden muss, sollten Sie diesen deklarieren, um sowohl logische Konsistenz als auch Leistung zu erhalten.

In diesem Artikel in meinem Blog erfahren Sie, warum Sie immer einen eindeutigen Index für eindeutige Daten erstellen sollten:

P.S. Es gibt einige sehr, sehr spezielle Fälle, in denen Sie keinen Primärschlüssel benötigen.

Meistens enthalten sie Protokolltabellen, die keine jede Indizes aus Leistungsgründen.

42voto

Theodore Zographos Punkte 1896

Stimmen Sie der vorgeschlagenen Antwort nicht zu. Die kurze Antwort lautet: NO .

Der Zweck des Primärschlüssels besteht darin, eine Zeile in der Tabelle eindeutig zu identifizieren, um eine Beziehung zu einer anderen Tabelle herzustellen. Traditionell wird zu diesem Zweck ein automatisch inkrementierter Integer-Wert verwendet, aber es gibt auch andere Varianten.

Es gibt jedoch Fälle, z. B. die Protokollierung von Zeitreihendaten, in denen die Existenz eines solchen Schlüssels einfach nicht erforderlich ist und nur Speicherplatz beansprucht. Eine Zeile eindeutig zu machen ist einfach ... nicht erforderlich!

Ein kleines Beispiel: Tabelle A: LogData

Columns:  DateAndTime, UserId, AttribA, AttribB, AttribC etc...

Kein Primärschlüssel erforderlich.

Tabelle B: Benutzer

Columns: Id, FirstName, LastName etc. 

Primärschlüssel (Id), der als "Fremdschlüssel" für die Tabelle LogData verwendet werden kann.

37voto

Michael Wheeler Punkte 2339

Am besten ist es immer, einen Primärschlüssel zu haben. Auf diese Weise erfüllt er erste Normalform und ermöglicht es Ihnen, den Weg der Datenbank-Normalisierung Pfad.

Wie bereits von anderen erwähnt, gibt es einige Gründe, die gegen einen Primärschlüssel sprechen, aber die meisten werden nicht beeinträchtigt, wenn es einen Primärschlüssel gibt

18voto

marc_s Punkte 701497

Abgesehen von einigen sehr seltenen Fällen (möglicherweise eine Tabelle mit vielen Beziehungen oder eine Tabelle, die Sie vorübergehend zum Laden großer Datenmengen verwenden) würde ich mich an die Redewendung halten:

Wenn sie keinen Primärschlüssel hat, ist sie keine Tabelle!

Marc

15voto

tvanfosson Punkte 506878

So gut wie jedes Mal, wenn ich eine Tabelle ohne Primärschlüssel erstellt habe, weil ich dachte, ich bräuchte keinen, musste ich am Ende einen hinzufügen. Ich erstelle jetzt sogar meine Verknüpfungstabellen mit einem automatisch generierten Identitätsfeld, das ich als Primärschlüssel verwende.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X