18 Stimmen

Sollte eine Datenbanktabelle immer Primärschlüssel haben?

Sollte ich immer einen Primärschlüssel in meinen Datenbanktabellen haben?

Nehmen wir die SO-Kennzeichnung. Sie können das Tag in jeder Revision sehen, es befindet sich wahrscheinlich in einer tag_rev-Tabelle mit der postID und der Revisionsnummer. Würde ich dafür eine PK benötigen?

Auch da es in einer Rev-Tabelle ist und nicht derzeit verwenden die Tags sollte ein Blob von tagIDs statt mehrere Einträge von mehreren post_id tagid Paar sein?

11voto

mmx Punkte 400975

A Tabelle sollte einen Primärschlüssel haben, damit Sie damit jede Zeile eindeutig identifizieren können.

Technisch gesehen, müssen Sie peut Tabellen ohne Primärschlüssel haben, aber Sie verstoßen damit gegen gute Datenbankdesignregeln.

9voto

Rob Punkte 47351

Sie sollten sich bemühen, einen Primärschlüssel in jeder nicht-trivialen Tabelle zu haben, in der Sie wahrscheinlich auf einzelne Datensätze über diesen Schlüssel zugreifen (oder sie aktualisieren oder löschen) wollen. Primärschlüssel können aus mehreren Spalten bestehen und sind formal gesehen der kürzeste verfügbare Superschlüssel, d. h. die kürzeste verfügbare Gruppe von Spalten, die zusammen eine beliebige Zeile eindeutig identifizieren.

Ich weiß nicht, wie das Datenbankschema von Stack Overflow aussieht (und nach dem, was ich in Jeffs Blog gelesen habe, will ich das auch gar nicht wissen), aber in der von Ihnen beschriebenen Situation ist es durchaus möglich, dass es einen Primärschlüssel über die Beitragskennung, die Revisionsnummer und den Tag-Wert gibt.

Was Ihren zweiten Punkt betrifft, so mag es zwar vernünftig sein, für die Aggregation von Werten in Archivtabellen zu plädieren, doch widerspricht dies dem Grundsatz, dass jeder Zeilen-/Spaltenschnittpunkt in einer Tabelle einen einzigen Wert enthalten sollte. Es mag zwar die Entwicklung etwas vereinfachen, aber es gibt keinen Grund, warum man sich nicht an eine normalisierte Tabelle mit versionierten Metadaten halten kann, selbst für so etwas Triviales wie Tags.

4voto

Pete TerMaat Punkte 3135

Siehe diese verwandte Frage, ob ein Ganzzahl Primärschlüssel erforderlich ist. In einer der Antworten wird das Tagging als Beispiel verwendet:

Gibt es gute Gründe, eine Datenbanktabelle ohne einen ganzzahligen Primärschlüssel zu haben?

Weitere Informationen zum Thema Kennzeichnung und Schlüssel finden Sie in dieser Frage:

Kennung für Tags in Tag-Systemen

3voto

James Black Punkte 41034

Ich neige dazu, zuzustimmen, dass die meisten Tabellen einen Primärschlüssel haben sollten. Mir fallen nur zwei Fälle ein, in denen dies nicht sinnvoll ist.

  1. Wenn Sie eine Tabelle haben, die Schlüssel mit anderen Schlüsseln verknüpft. Um zum Beispiel eine user_id mit einer answer_id zu verknüpfen, bräuchte diese Tabelle keinen Primärschlüssel.
  2. Eine Protokolltabelle, deren einziger Zweck darin besteht, einen Prüfpfad zu erstellen.

Grundsätzlich ist ein Primärschlüssel wichtig, wenn Sie eine Tabelle schreiben, auf die möglicherweise jemals in einer Fremdschlüsselbeziehung verwiesen werden muss, und wenn Sie nicht sicher sein können, dass dies nicht der Fall sein wird, fügen Sie einfach den PK hinzu :)

3voto

e18r Punkte 6410

Aus dem Abschnitt des MySQL 5.5-Referenzhandbuchs 13.1.17 :

Wenn Sie keinen PRIMARY KEY haben und eine Anwendung nach dem PRIMARY KEY in Ihren Tabellen fragt, gibt MySQL den ersten UNIQUE-Index, der keine NULL-Spalten hat, als PRIMARY KEY zurück.

Technisch gesehen lautet die Antwort also nein. Aber wie andere bereits gesagt haben, ist es in den meisten Fällen recht nützlich.

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