Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wird string oder int für Fremdschlüssel bevorzugt?

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.