Es kommt darauf an
Es gibt viele bestehende Diskussionen über die Kompromisse zwischen natürlichen und Ersatzschlüsseln - Sie müssen entscheiden, was für Sie funktioniert und was der „Standard“ in Ihrer Organisation ist.
Im Fall des OP gibt es sowohl einen Ersatzschlüssel (int userId
) und einen natürlichen Schlüssel (char
oder varchar username
). Beide Spalten können als Primärschlüssel für die Tabelle verwendet werden, und in beiden Fällen können Sie immer noch die Eindeutigkeit des anderen Schlüssels erzwingen.
Hier sind einige Überlegungen, wenn Sie sich für die eine oder andere Methode entscheiden:
Der Fall für die Verwendung von Ersatzschlüsseln (z. B. UserId INT AUTO_INCREMENT)
Wenn Sie einen Ersatz verwenden (z. B. UserId INT AUTO_INCREMENT
) als Primärschlüssel, dann alle Tabellen, die auf die Tabelle MyUsers
verweisen sollte dann UserId
verwenden als Fremdschlüssel.
Sie können jedoch immer noch die Eindeutigkeit des username
erzwingen Spalte durch Verwendung eines zusätzlichen eindeutigen Index
, z. B.:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
Wie bei @Dagon ist die Verwendung eines schmalen Primärschlüssels (wie ein int
) hat Leistungs- und Speichervorteile gegenüber der Verwendung eines breiteren Werts (und variabler Länge) wie varchar
. Dieser Vorteil wirkt sich auch auf weitere Tabellen aus, die auf MyUsers
verweisen , als Fremdschlüssel zu userid
schmaler sein (weniger Bytes zum Abrufen).
Ein weiterer Vorteil des ganzzahligen Ersatzschlüssels besteht darin, dass der Benutzername einfach geändert werden kann, ohne dass sich dies auf Tabellen auswirkt, die auf MyUsers
verweisen .Wenn der username
wurde als natürlicher Schlüssel verwendet, und andere Tabellen sind an MyUsers
gekoppelt über username
, ist es sehr umständlich, einen Benutzernamen zu ändern (da sonst die Fremdschlüsselbeziehung verletzt würde). Wenn das Aktualisieren von Benutzernamen für Tabellen mit username
erforderlich war als Fremdschlüssel eine Technik wie ON UPDATE CASCADE
wird benötigt, um die Datenintegrität zu wahren.
Der Fall für die Verwendung von Natural Keys (d. h. Benutzername)
Ein Nachteil der Verwendung von Ersatzschlüsseln ist, dass andere Tabellen auf MyUsers
verweisen über einen Ersatzschlüssel muss JOIN
sein zurück zu MyUsers
Tabelle, wenn der username
Spalte erforderlich. Einer der potenziellen Vorteile von Natural-Schlüsseln besteht darin, dass für eine Abfrage nur der username
erforderlich ist Spalte aus einer Tabelle, die auf MyUsers
verweist , dass es nicht zu MyUsers
zurückkehren muss um den Benutzernamen abzurufen, wodurch I/O-Overhead eingespart wird.