Ist die string-oder int-bevorzugt für ausländische keys?
Ich habe eine user-Tabelle mit userid
und username
Spalten, und beide eindeutig sind.
Zwischen userid
und username
, die besser ist, als eine foreign key-und warum?
Mein Chef will Zeichenfolge verwenden, ist das ok?
- Darf ich Fragen, warum du zwei eindeutige Spalten in der Tabelle?
- Warum kann er nicht zwei eindeutige Spalten.Wie eine ID, E-Mail und Benutzernamen. Sie können alle einzigartig, können nicht Sie?
- Ich gebe zu. Dumme Frage. Frage mich nur, wenn die beiden Spalten waren tatsächlich beschreiben die gleiche Sache. nonnb die Frage beantwortet beatifully.
- Vielen Dank für die Bearbeitung verbessern wollen grammer .
- Du bist herzlich willkommen. Ich habe nur die Aufmerksamkeit auf die Titel, Rechtschreibung und Interpunktion auf, die die erste Bearbeitung. Ich ging durch eine zweite Zeit und verbessert die Grammatik.
- Vielen Dank, Ihr Englisch ist sehr gut . verbessern wollen die mine.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es aussieht, haben beide einen Ersatzschlüssel (
int userId
) und ein natürlicher Schlüssel (char
odervarchar username
). Entweder die Spalte kann verwendet werden als Primärschlüssel für die Tabelle, und so oder so, Sie werden immer noch in der Lage sein, um die Eindeutigkeit der andere Schlüssel.Gibt es hier viele Diskussionen über die trade-offs zwischen Natürlichen und Surrogat-Schlüssel - Sie müssen entscheiden, was für Sie arbeitet, und was der 'standard' ist innerhalb Ihrer organisation.
Hier sind einige überlegungen bei der Auswahl der einen oder der anderen:
Der Fall für die Verwendung von Ersatzschlüsseln (z.B. UserId INT AUTO_INCREMENT)
Wenn Sie eine Leihmutter, (z.B.
UserId INT AUTO_INCREMENT
) als Primärschlüssel, dann werden alle Tabellen verweisen auf die TabelleMyUsers
sollen dannUserId
als Foreign Key.Können Sie jedoch immer noch die Eindeutigkeit der
username
Spalte durch den Einsatz einer zusätzlichen eindeutiger index, z.B.:Als pro @Dagon, mit einem schmalen, primary key (wie ein
int
) hat Leistung und Speicher Vorteile gegenüber der Verwendung einer breiteren (und variabler Länge) Wert wievarchar
. Dieser Vorteil hat auch Auswirkungen auf weitere Tabellen, die ReferenzMyUsers
, als foreign key zuuserid
wird schmaler.Ein weiterer Vorteil der Surrogat-integer-Schlüssel ist, dass der Benutzername kann problemlos verändert werden, ohne die Tabellen verweisen auf
MyUsers
.Wenn die
username
verwendet wurde, wie ein natürlicher Schlüssel, dann Tische waren gekoppelt anMyUsers
überusername
sind, macht es mehr umständlich zu ändern, einen Benutzernamen (da die Foreign Key-Beziehung würde sonst verletzt werden). Wenn die Aktualisierung Benutzernamen erforderlich war, auf Tabellen mitusername
als foreign key, eine Technik wie ON UPDATE CASCADE müssten eingesetzt werden, um die retain-Daten auf Integrität.Der Fall ist, mit Natürlichen Schlüssel (D. H. Benutzername)
Auf der Seite nach unten für die Verwendung von Ersatzschlüsseln, andere Tabellen, die Referenz
MyUsers
über ein Ersatzschlüssel wird immer erfordern einejoin
zurück zu denMyUsers
Tabelle zum abrufen des Benutzernamens. Einer der potenziellen Vorteile der Natürlichen Schlüssel ist, dass, wenn eine Abfrage erfordert nur dieUsername
Spalte aus einer Tabelle referenzierenMyUsers
, die es brauchen, nicht kommen zurück, umMyUsers
zum abrufen der Benutzer-name, das spart einigen Aufwand.Weitere Hinweise auf die Natur-vs Surrogat-Debatte und trade-offs hier und hier
int index schneller ist, kann oder kann nicht ein Problem sein, schwer zu sagen, basierend auf, was Sie zur Verfügung gestellt haben
Ein int ist 4 bytes ein string sein kann, wie viele bytes, wie Sie möchten. Weil ein int wird immer besser. Es sei denn natürlich wenn du dich mit Benutzernamen, die weniger als 4 Zeichen lang ist 🙂
Außerdem sollten Sie nie verwenden, eine Spalte als PK/FK, wenn die Daten innerhalb der Spalte selbst geändert werden können. Benutzer neigen dazu, zu ändern, Ihren Benutzernamen, und selbst wenn diese Funktionalität nicht vorhanden ist, Ihre app jetzt, maby, es wird in ein paar Jahren. Wenn dieser Tag kommt, haben Sie vielleicht 1000 Tabellen, die Referenz, die Benutzer-Tabelle, und dann müssen Sie aktualisieren alle 1000 Tabellen in einer Transaktion, und das ist einfach nur schlecht.
Kommt es auf die Fremdschlüssel: Wenn Ihr Unternehmen hat die Kontrolle über es, dann empfehle ich die Verwendung einer Int-wenn es ein ID-Feld für Sie. Allerdings, manchmal ein ID-Feld ist nicht auf einem Tisch, weil ein anderer Schlüssel macht Sinn, wie eine Alternative eindeutigen Schlüssel. Also, das ID-Feld wird möglicherweise ein Surrogat-Schlüssel in diesem Fall.
Faustregel: Dein foreign-key-Daten-Typ sollte entsprechend Ihrer primären Schlüssel Daten geben.
Hier eine Ausnahme: was Sie über Fremdschlüssel, die gehören nicht zu Ihrem Unternehmen? Was ist Fremdschlüssel in Datenbanken und APIs, die Sie haben keine Kontrolle über? Diese IDs sollten immer strings sein IMO.
Davon zu überzeugen, Sie, ich diese Fragen:
Machst du Mathe drauf??? Sind Sie Inkrementieren das? Sie haben die Kontrolle über Sie? APIs sind berüchtigt für die änderung, die auch Datentypen KÖNNEN geändert werden, jemand anderes die Datenbank... also, wie viel wird es, Sie Durcheinander zu bringen, wenn eine int-ID wird ein hex?