Database
 sql >> Datenbank >  >> RDS >> Database

Können mehrere Primärschlüssel in einer einzelnen Tabelle vorhanden sein?

  • Was sind Schlüssel?
    • Einfache Tasten
    • Verkettete oder zusammengesetzte Schlüssel
    • Primärschlüssel
      • Nummerierung und automatisches Inkrementieren
  • Kann eine Tabelle mehrere Primärschlüssel enthalten?

Während viele Entwickler und Datenbankadministratoren möglicherweise mit primary keys arbeiten Jeden Tag ist es ein faszinierendes Thema, sich zu fragen:„Was genau ist ein primary key und kann (oder sollte) eine Datenbanktabelle mehrere primary key enthalten gleichzeitig?“

Im Folgenden werden wir diese Fragen genauer untersuchen und versuchen, zu einem vernünftigen und allgemein vereinbarten Konsens innerhalb der Entwicklergemeinschaft zu kommen.

Was sind Schlüssel?

Um zu verstehen, was ein primary key ist in einer Datenbanktabelle befindet, müssen wir zuerst etwas über non-primary keys verstehen . Ein key in einer Tabelle ist einfach ein Attribut, das verwendet wird, um diese Informationen zu identifizieren und darauf zuzugreifen. Eine Tabelle kann und wird oft mehrere Schlüssel haben, wie zum Beispiel in der Tabelle Users beide email und username könnten als Schlüssel betrachtet werden.

Abhängig von dem Entwickler oder Administrator, mit dem Sie sprechen, hören Sie möglicherweise von einer Vielzahl von Schlüsseltypen und ihren Definitionen, daher behandeln wir unten nur ein paar verschiedene Beispiele und eine grundlegende Definition von jedem.

Einfache Tasten

Ein simple key ist nur ein Schlüssel, der nur ein einziges Attribut in der Tabelle verwendet. Sofern wir dem Schlüssel oder der Tabelle keine weiteren Einschränkungen auferlegen, dann der username Attribut im obigen Beispiel ist ein simple key .

Verkettete oder zusammengesetzte Schlüssel

Noch einen Schritt weiter von simple keys werden concatenated oder compound Schlüssel. Wie der Name schon sagt, ein concatenated key ist ein Zusammenfügen mehrerer single keys . Beispielsweise kann das System den last_name automatisch kombinieren und year_of_birth single keys in einen concatenated key , etwa so:smith1980 .

Primärschlüssel

Ein [primary key](https://en.wikipedia.org/wiki/Unique_key) ist ein Schlüssel, der als Prinzipal (oder primär) ausgewählt wurde ) repräsentatives Attribut für diese Datenzeile. Der primary key ist einzigartig und dieses Attribut wird dann in der gesamten Datenbank verwendet und wird aufgerufen und als repräsentatives Attribut für die betreffenden Daten an andere Tabellen weitergegeben.

In der Praxis der primary key Attribut ist auch als NOT NULL markiert in den meisten Datenbanken, was bedeutet, dass das Attribut immer einen Wert für den in die Tabelle einzufügenden Datensatz enthalten muss.

Als Beispiel entweder die email oder username simple keys könnte die Bezeichnung des primary key zugewiesen werden , aber in der Regel empfiehlt es sich, den primary key festzulegen zu einem Attribut, das weder durch die Geschäftslogik noch durch den Einzelnen geändert wird (oder werden konnte). Stellen Sie sich zum Beispiel einen User vor erhält eine neue E-Mail-Adresse, die dann alle bisherigen primary key bewirkt Zuordnungen, die mit der alten E-Mail-Adresse vorgenommen wurden, werden bei Verwendung der neuen E-Mail-Adresse ungültig.

Aus diesem Grund (unter anderem) sind die meisten primary key Verwenden Sie eine Zahl oder eine eindeutige Zeichenfolge, z. B. [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) .

Nummerierung und automatisches Incrementing

Es sei auch kurz erwähnt, dass viele Datenbanksysteme so eingerichtet sind, dass jede Tabelle einen primary key hat das ist sowohl numerisch als auch automatisch inkrementiert. Das bedeutet einfach, dass die Datenbank-Engine automatisch jedem neuen Datensatz in dieser Tabelle einen eindeutigen primary key zuweist Wert, der inkrementell größer ist als alle vorherigen Werte. Die meisten Entwickler sind sich jedoch einig, dass diese Vorgehensweise veraltet ist und unnötige Sicherheitslücken für das System aufdeckt, wenn sie für einige verwendet wird Tabellen, die bestimmte Daten darstellen.

Stellen Sie sich zum Beispiel alle User vor Datensätzen wird ein automatisch inkrementierter primary key zugewiesen Wert, bekannt als id Attribut. Wenn eine böswillige Person entdeckt, dass die id Attribut eines bestimmten Benutzers (z. B. John Smith) ist der Wert 1500 , dies gibt bereits ein paar Informationen preis. Erstens zeigt es an, dass es wahrscheinlich mindestens 1499 andere Benutzer im System gibt oder zu irgendeinem Zeitpunkt gab. Es bedeutet auch, dass auf die Benutzerseite von John Smith über einen URL- oder API-Aufruf zugegriffen werden kann, der diese id enthält Wert von 1500 , dann besteht eine gute Chance, den Wert einfach in eine andere Zahl zu ändern, z. B. 1499 oder 1501 , zeigt die Seite eines anderen Benutzers an, der möglicherweise nicht möchte, dass dieser Besucher auf seine Seite zugreift. Auf diese Weise können Aufzeichnungen durch einfaches Raten abgefragt werden die id Werte auf einer Massenskala.

Dies sind offensichtlich sehr einfache Beispiele, aber aus diesen Gründen verwenden die meisten modernen Datenbanken einen zufälligen und eindeutigen primary key Attributwert wie eine UUID bei der Arbeit mit sensiblen Daten.

Kann eine Tabelle mehrere Primärschlüssel enthalten?

Die kurze Antwort ist nein , darf eine Tabelle nicht mehrere primary key enthalten , da dies gegen die Grundprinzipien des relationalen Datenbankdesigns verstößt (siehe:[database normalisation](https://en.wikipedia.org/wiki/Database_normalisation)). und [Third normal form](https://en.wikipedia.org/wiki/Third_normal_form) ).

Es ist Es ist möglich, dass eine Tabelle mehrere candidate keys hat , die sich effektiv ähnlich wie ein primary key verhalten darin ein candidate keys ist eindeutig, NOT NULL , und ist eine singuläre Darstellung dieses Tabellendatensatzes.

Allerdings, wenn es darum geht, einen auszuwählen Attribut wird als primary key zugewiesen für die Tabelle kommt die Auswahl aus der Liste aller potentiellen candidate keys (daher der Name, sie sind Kandidaten dafür, ein primary key zu werden ). Letztendlich nur ein candidate keys wird als das beste repräsentative Attribut für diesen Datensatz ausgewählt, um in dieser Tabelle als primary key verwendet zu werden und an anderer Stelle in der Datenbank von anderen Tabellen über ihre jeweiligen foreign keys referenziert werden .