E-Mail-Adresse als Primärschlüssel verwenden?

234

Ist die E-Mail-Adresse im Vergleich zu automatisch inkrementierenden Nummern ein schlechter Kandidat für die primäre Adresse?

Unsere Webanwendung benötigt eine eindeutige E-Mail-Adresse im System. Also dachte ich daran, die E-Mail-Adresse als Primärschlüssel zu verwenden. Mein Kollege schlägt jedoch vor, dass der Zeichenfolgenvergleich langsamer ist als der Ganzzahlvergleich.

Ist es ein triftiger Grund, E-Mail nicht als Primärschlüssel zu verwenden?

Wir verwenden PostgreSQL.

Robert
quelle
5
Was meinst du mit "primär"? Wenn die E-Mail-Adresse eindeutig sein muss, ist sie ein Schlüssel und erfordert eine eindeutige Einschränkung. Es ist willkürlich, ob Sie sich dafür entscheiden, "primär" zu "fördern", es sei denn, es gibt einen praktischen Grund dafür, z. B. die Optimierung eines Systems mit schlechter Leistung.
Tag, wenn
7
Wenn Ihre Datenbank eine eindeutige E-Mail-Adresse erzwingen soll, erstellen Sie eine Spalte mit einem eindeutigen Index, verwenden Sie diese jedoch nicht als Primärschlüssel.
James Westgate
103
@robert Was ist, wenn jemand seine E-Mail-Adresse ändern möchte? Wirst du auch alle Fremdschlüssel ändern?
Systempuntoout
3
@onedaywhen - kaum ein Unterschied, aber der Primärschlüssel wird standardmäßig geclustert, während dies bei einem eindeutigen Index nicht der Fall ist. Sie möchten weiterhin den Primärschlüssel definieren, der der Standard-Suchschlüssel für einzelne Datensätze ist. Der eindeutige Index erzwingt lediglich die Eindeutigkeit der Spalte gegenüber einem normalen Index
James Westgate,
3
@ James Westgate: Zu Ihrer Information, es gibt kein automatisches Clustering in PostgreSQL. Ein PRIMARY KEY ist auf der Festplatte genauso implementiert wie ein EINZIGARTIGER INDEX, in dem alle Felder NICHT NULL sind.
Matthew Wood

Antworten:

283

Der String-Vergleich ist langsamer als der Int-Vergleich. Dies spielt jedoch keine Rolle, wenn Sie einfach einen Benutzer mithilfe der E-Mail-Adresse aus der Datenbank abrufen. Es spielt keine Rolle, ob Sie komplexe Abfragen mit mehreren Verknüpfungen haben.

Wenn Sie Informationen zu Benutzern in mehreren Tabellen speichern, sind die Fremdschlüssel für die Benutzertabelle die E-Mail-Adresse. Das bedeutet, dass Sie die E-Mail-Adresse mehrmals speichern.

Sjoerd
quelle
11
@Sjoerd: Das Problem ist nicht, dass die E-Mail-Adresse mehrmals gespeichert wird, obwohl dies definitiv ineffizient ist, aber wer kümmert sich heute um den Festplattenspeicher. Die meisten Unternehmen haben keine Google-Skala, wo dies wichtig wäre. Das Problem ist, dass die E-Mail-Adresse danach nicht mehr geändert werden kann, da es sich sowohl um einen Primärschlüssel als auch um einen Fremdschlüssel handelt.
Stefan Steiger
@StefanSteiger Wer hat etwas über Festplattenspeicher gesagt? Alles, was Sie speichern, nimmt Speicherplatz im RAM ein.
Jonathan Allen
Für den Fall, dass sich jemand wie ich wundert, würde ein GUID-Schlüssel einem E-Mail-Schlüssel entsprechen, den ich denke.
Tofutim
178

Ich werde auch darauf hinweisen, dass E-Mail eine schlechte Wahl ist, um ein einzigartiges Feld zu erstellen. Es gibt Menschen und sogar kleine Unternehmen, die eine E-Mail-Adresse teilen. Und wie Telefonnummern können E-Mails wiederverwendet werden. [email protected] kann leicht ein Jahr John Smith und zwei Jahre später Julia Smith gehören.

Ein weiteres Problem bei E-Mails ist, dass sie sich häufig ändern. Wenn Sie mit diesem Schlüssel anderen Tabellen beitreten, müssen Sie auch die anderen Tabellen aktualisieren. Dies kann ein ziemlicher Leistungseinbruch sein, wenn ein gesamtes Kundenunternehmen seine E-Mails ändert (was ich gesehen habe).

HLGEM
quelle
47
+1 für die Erwähnung des Problems der kaskadierenden Aktualisierung. Deshalb lassen Freunde Freunde nur Ersatzschlüssel verwenden ;-).
Sleske
10
ah, ich mag das Sprichwort überhaupt nicht ... Ersatzschlüssel können auch die Ursache von Problemen sein; Ja, die Anwendung ist robuster gegenüber Änderungen der Geschäfts- und / oder Integritätsregeln. Die Informationen können jedoch etwas leichter verloren gehen und die Identität der Datensätze wird weniger klar. daher würde ich hier keine Faustregel empfehlen ...
Unreason
12
@onedaywhen und @jay, nur weil Sie denken, dass es einzigartig sein sollte, machen Sie es nicht einzigartig. Und ja, ein Ehemann und eine Ehefrau könnten unterschiedliche Kunden sein. Nur weil Sie noch nie darauf gestoßen sind, heißt das nicht, dass es nicht passieren wird. Ich bin darauf gestoßen und es kommt vor, weshalb E-Mails niemals als eindeutig angesehen werden dürfen, unabhängig davon, ob Sie der Meinung sind, dass dies der Fall sein sollte oder nicht. Dies ist die Art von Anforderung, die Sie zurückschieben, weil sie von Natur aus falsch ist.
HLGEM
15
@HLGEM: Ich möchte nicht auf ein endloses Argument eingehen, aber man kann nicht sagen, dass ein vorgeschlagener Schlüssel nicht eindeutig ist, basierend auf Hypothesen, ohne den Kontext zu kennen. zB aus Sicht der Telefongesellschaft identifiziert eine Telefonnummer einen Kunden per Definition eindeutig. Ja, Sie können sagen: "Aber was ist, wenn zwei oder drei Personen antworten, wenn Sie diese Nummer anrufen?" Das ist aber irrelevant. Aus Sicht der Telefongesellschaft ist dies per Definition ein Kunde. (Fortsetzung ...)
Jay
14
(Fortsetzung) Wenn Sie ein System erstellen, das sich hauptsächlich mit E-Mail-Kommunikation befasst - möglicherweise ein Nachrichtenversandsystem oder ein Benachrichtigungsweiterleitungssystem -, ist es wahrscheinlich, dass eine E-Mail-Adresse einen Benutzer per Definition eindeutig identifiziert. Wenn mehrere Personen diese E-Mail-Adresse gemeinsam nutzen, ist dies irrelevant. Sie sind ein einzelnes Nachrichtenziel, daher sind sie ein einzelner Benutzer. "Benutzer" und "Kunde" müssen keine Synonyme für "individueller Mensch" sein.
Jay
99

Der Primärschlüssel sollte eindeutig und konstant sein

E-Mail-Adressen ändern sich wie die Jahreszeiten. Nützlich als Sekundärschlüssel für die Suche, aber eine schlechte Wahl für den Primärschlüssel.

Steven A. Lowe
quelle
17
Eine Eigenschaft eines guten Schlüssels ist, dass er stabil, aber NICHT unbedingt unveränderlich sein sollte.
Tag, wenn
5
@onedaywhen: Ja! Warum sollte SQL sonst kaskadierende Updates unterstützen?
Bill Karwin
18
Wenn Sie die Wahl haben, wählen Sie konstante / unveränderliche Schlüssel. weniger Arbeit für Sie die Straße hinunter; Nur weil SQL kaskadierende Updates unterstützt, ist dies nicht immer eine gute Idee!
Steven A. Lowe
7
@ Vincent Malgrat: "Kaskadierende Updates ... bremst DB-Normalisierung" - Ich denke, Sie haben das Konzept der Normalisierung falsch verstanden!
Tag, wenn
5
@ Vincent Malgrat: Danke, dass Sie bestätigt haben, dass Sie das Konzept der Normalisierung tatsächlich falsch verstanden haben. "Sie sollten nicht die gleichen Informationen in mehreren Zeilen wiederholen lassen" - wollten Sie wirklich "Informationen" sagen?! Ein zusammengesetzter Schlüssel enthält normalerweise Werte, die in mehreren Zeilen wiederholt werden. Bei einem Fremdschlüssel wird auf Werte verwiesen und nicht "wiederholt", ein großer Unterschied. Eine einspaltige Domäne mit zwei Werten (z. B. "Ja" und "Nein") hat dieselben Werte für mehrere Zeilen in einer Referenzierungstabelle, wenn sie drei oder mehr Zeilen enthält. Das ist wirklich grundlegendes Zeug!
Tag, wenn
64

Nachteile der Verwendung einer E-Mail-Adresse als Primärschlüssel:

  1. Langsamer beim Zusammenfügen.

  2. Jeder andere Datensatz mit einem veröffentlichten Fremdschlüssel hat jetzt einen größeren Wert und belegt mehr Speicherplatz. (Angesichts der heutigen Kosten für Speicherplatz ist dies wahrscheinlich ein triviales Problem, außer in dem Maße, in dem das Lesen des Datensatzes jetzt länger dauert. Siehe Nr. 1.)

  3. Eine E-Mail-Adresse kann sich ändern, wodurch alle Datensätze, die diesen als Fremdschlüssel verwenden, aktualisiert werden müssen. Da sich die E-Mail-Adresse nicht allzu oft ändert, ist das Leistungsproblem wahrscheinlich geringfügig. Das größere Problem ist, dass Sie sicherstellen müssen, dass Sie dafür sorgen. Wenn Sie den Code schreiben müssen, ist dies mehr Arbeit und führt die Möglichkeit von Fehlern ein. Wenn Ihr Datenbankmodul "On Update Cascade" unterstützt, ist dies ein kleines Problem.

Vorteile der Verwendung der E-Mail-Adresse als Primärschlüssel:

  1. Möglicherweise können Sie einige Verknüpfungen vollständig entfernen. Wenn Sie aus dem "Stammsatz" nur die E-Mail-Adresse benötigen, müssen Sie mit einem abstrakten Ganzzahlschlüssel einen Join ausführen, um ihn abzurufen. Wenn der Schlüssel die E-Mail-Adresse ist, haben Sie sie bereits und der Join ist nicht erforderlich. Ob dies Ihnen hilft, hängt davon ab, wie oft diese Situation auftritt.

  2. Wenn Sie Ad-hoc-Abfragen durchführen, kann ein Mensch leicht erkennen, auf welchen Stammsatz verwiesen wird. Dies kann eine große Hilfe sein, wenn Sie versuchen, Datenprobleme aufzuspüren.

  3. Mit ziemlicher Sicherheit benötigen Sie ohnehin einen Index für die E-Mail-Adresse. Wenn Sie ihn zum Primärschlüssel machen, wird ein Index eliminiert, wodurch die Leistung von Einfügungen verbessert wird, da nur noch ein Index anstelle von zwei zu aktualisieren ist.

Meiner bescheidenen Meinung nach ist es so oder so kein Slam-Dunk. Ich bevorzuge die Verwendung natürlicher Schlüssel, wenn ein praktischer verfügbar ist, da sie nur einfacher zu handhaben sind und die Nachteile in den meisten Fällen nicht wirklich wichtig sind.

Jay
quelle
@Conrad: Obwohl er darauf hinweist, dass es keine PITA ist, wenn Sie eine Engine haben, die ON UPDATE CASCADE unterstützt. In Bezug auf den Code ist dies zu diesem Zeitpunkt kein Problem. Das einzige wirkliche Problem ist, wie umfangreich das Update ist und wie breit der Schlüssel ist. Die E-Mail-Adresse mag ein bisschen viel sein, aber ein CASCADE-UPDATE für eine PK mit 2-stelligem Ländercode ist keine große Sache.
Matthew Wood
5
@ Matthew IMHO ist es immer noch eine PITA. Nehmen wir zum Beispiel an, dass es beim Entwerfen Ihrer Ländertabelle nur zwei Tabellen gab, die darauf verweisen, keine große, aber im Laufe der Zeit wurden es 20 Tabellen mit jeweils Hunderttausenden von Datensätzen. Einige mit der Referenz, andere ohne. Dies führt dazu, dass ein einzelner Logikschreibvorgang Zehntausende von Schreibvorgängen umfasst und nicht alle Tabellen erreicht, da beim Hinzufügen der Tabelle jemand eine Referenz vergessen hat. Dies ist genau das, was mir auf einer 2-Zeichen-Ländercodetabelle passiert ist.
Conrad Frix
@ Wood & Conrad: Der schlimmste Fall ist, wenn keine integrierte DB-Unterstützung vorhanden ist. Dann müssen Sie Code für jede Tabelle mit einer veröffentlichten Referenz schreiben, und dies ist nur ein Schmerz und eine Tür, in die Fehler eindringen können. Bei den Kaskaden müssen Sie nur daran denken, eine Klausel in jede Tabelle einzufügen, nicht in eine solche eine große Sache.
Jay
2
Vorteil 1 und 3 sind vorzeitige Optimierungen, Vorteil 2 ist ein sehr geringer Vorteil und wird von jedem anständigen Abfragetool vollständig überwunden.
Ash
4
@Ash: Du bist ein Unterschied zwischen "Optimierung" und "vorzeitige Optimierung". Aber okay, aus den gleichen Gründen sind alle Nachteile, die ich gesehen habe, vorzeitige Optimierungen. Wo bleibt dir das? In Bezug auf # 2 empfinde ich das Eingeben zusätzlicher Joins, wenn ich versuche, Ad-hoc-Abfragen durchzuführen, als großen Schmerz. Datensätze haben häufig mehrere Fremdschlüssel, sodass Sie möglicherweise mehrere Verknüpfungen benötigen, um verständliche Daten zu erhalten. Wenn Sie mit "anständiges Abfragetool" eines meinen, das herausfindet, welche Daten Sie sehen möchten, ohne dass Sie es sagen, und die Verknüpfungen auf magische Weise für Sie erledigt, würde ich gerne sehen, wie das funktioniert.
Jay
12

Es ist ziemlich schlimm. Angenommen, ein E-Mail-Anbieter hat sein Geschäft eingestellt. Benutzer möchten dann ihre E-Mail ändern. Wenn Sie E-Mail als Primärschlüssel verwendet haben, duplizieren alle Fremdschlüssel für Benutzer diese E-Mail, was das Ändern verdammt schwierig macht ...

... und ich habe noch nicht einmal über Leistungsaspekte gesprochen.

Meriton
quelle
Wie würde das Ändern von E-Mail-Adressen zu Duplikaten führen? Es sei denn, Benutzer A ändert seine E-Mail-Adresse und Benutzer B ändert seine E-Mail-Adresse so, dass sie dem alten Wert von Benutzer A entspricht, und Ihre Aktualisierungen werden nicht nacheinander durchgeführt. Aus der Ferne möglich, denke ich.
Jay
2
Eine Fremdschlüsselreferenz enthält per Definition den Wert des Primärschlüssels der Zeile, auf die sie verweist. Anders ausgedrückt, es dupliziert den Wert des Primärschlüssels. (Das Duplizieren wird also nicht durch Ändern des Werts verursacht. Das Ändern ist jedoch aufgrund dieser Duplizierung und der Einschränkung, die sie erzwingt, schwieriger.)
Meriton
5
+1 für die Zeile "Angenommen, ein E-Mail-Anbieter geht aus dem Geschäft."
Reddy
Das ist kein Problem. Es gibt eine Fremdschlüsselkaskadierung, um dieses Problem zu lösen. Wenn ein Benutzer seine E-Mail-Adresse ändert, wird die Änderung auf alle Tabellen übertragen, die sie als Fremdschlüssel verwenden.
Rafa
1
@rafa, ich versichere Ihnen, dass Ihre Datenbank für Stunden und möglicherweise Tage für alle Benutzer gesperrt ist, wenn Sie kaskadierende Updates verwenden und ein ganzer Anbieter sein Geschäft aufgibt oder seinen Namen ändert (Yahoo.com wird zu HooYa.com) durch das System. Es ist ein sehr gültiges Problem (und ein Grund, warum es eine schlechte Idee ist, kaskadierende Updates zu verwenden, wenn Sie eine signifikante Datenmenge haben und der Schlüssel sich wahrscheinlich ändern wird.)
HLGEM
12

Ich weiß nicht, ob dies ein Problem in Ihrem Setup sein könnte, aber abhängig von Ihrem RDBMS können die Werte einer Spalte zwischen Groß- und Kleinschreibung unterscheiden . In PostgreSQL-Dokumenten heißt es: „Wenn Sie eine Spalte als EINZIGARTIG oder PRIMARY KEY deklarieren, unterscheidet der implizit generierte Index zwischen Groß- und Kleinschreibung.“ Mit anderen Worten, wenn Sie Benutzereingaben für eine Suche in einer Tabelle mit E-Mail als Primärschlüssel akzeptieren und der Benutzer "[email protected]" angibt, wird "[email protected]" nicht gefunden.

xlttj
quelle
7
Erwähnenswert in diesem Zusammenhang ist, dass [email protected] und [email protected] möglicherweise dasselbe Postfach oder unterschiedliche Postfächer sind und Sie keine Möglichkeit haben zu sagen - in der Spezifikation gibt es nichts zu sagen, ob der lokale Teil case- ist. empfindlich.
Telent
Dies ist eher ein allgemeines Problem bei der Durchsetzung der Eindeutigkeit von E-Mail-Adressen als die Frage, ob sie als Primärschlüssel verwendet werden sollen - das gleiche Problem tritt in beiden Fällen auf. +1, weil es immer noch ein sehr nützlicher Punkt ist
11

Niemand scheint ein mögliches Problem erwähnt zu haben, dass E-Mail-Adressen als privat angesehen werden könnten. Wenn die E-Mail-Adresse der Primärschlüssel ist, sieht eine Profilseiten-URL höchstwahrscheinlich so aus ..../Users/[email protected]. Was ist, wenn Sie die E-Mail-Adresse des Benutzers nicht offenlegen möchten? Sie müssten einen anderen Weg finden, um den Benutzer zu identifizieren, möglicherweise durch einen eindeutigen ganzzahligen Wert, um URLs wie zu machen ..../Users/1. Dann hätten Sie doch einen eindeutigen ganzzahligen Wert.

Simen Echholt
quelle
9

Auf der logischen Ebene ist die E-Mail der natürliche Schlüssel. Auf der physischen Ebene passt der natürliche Schlüssel nicht gut zum Primärschlüssel, da Sie eine relationale Datenbank verwenden. Der Grund sind hauptsächlich die von anderen genannten Leistungsprobleme.

Aus diesem Grund kann das Design angepasst werden. Der natürliche Schlüssel wird zum alternativen Schlüssel (EINZIGARTIG, NICHT NULL), und Sie verwenden einen Ersatz- / künstlichen / technischen Schlüssel als Primärschlüssel, der in Ihrem Fall automatisch erhöht werden kann.

Systempuntoout fragte,

Was ist, wenn jemand seine E-Mail-Adresse ändern möchte? Wirst du auch alle Fremdschlüssel ändern?

Das ist , was Kaskadierung ist für.

Ein weiterer Grund für die Verwendung eines numerischen Ersatzschlüssels als Primärschlüssel hängt mit der Funktionsweise der Indizierung auf Ihrer Plattform zusammen. In der InnoDB von MySQL ist beispielsweise allen Indizes in einer Tabelle der Primärschlüssel vorangestellt, sodass die PK so klein wie möglich sein soll (aus Gründen der Geschwindigkeit und Größe). Auch in diesem Zusammenhang ist InnoDB schneller, wenn der Primärschlüssel nacheinander gespeichert wird, und eine Zeichenfolge würde dort nicht helfen.

Eine andere Sache, die Sie berücksichtigen sollten, wenn Sie eine Zeichenfolge als alternativen Schlüssel verwenden, ist, dass die Verwendung eines Hashs der tatsächlichen Zeichenfolge, die Sie möchten, möglicherweise schneller ist und Dinge wie Groß- und Kleinbuchstaben einiger Buchstaben überspringt. (Ich bin tatsächlich hier gelandet, als ich nach einer Referenz gesucht habe, um zu bestätigen, was ich gerade gesagt habe; ich suche immer noch ...)

Rafa
quelle
4

Ja, es ist besser, wenn Sie stattdessen eine Ganzzahl verwenden. Sie können Ihre E-Mail-Spalte auch als eindeutige Einschränkung festlegen.

so was:

CREATE TABLE myTable(
    id integer primary key,
    email text UNIQUE
);
ibram
quelle
8
Warum ist es "besser"? Irgendwelche Gründe oder Quellen?
Sjoerd
20
Können Sie das näher erläutern?
Sjoerd
4

Ja, es ist ein schlechter Primärschlüssel, da Ihre Benutzer ihre E-Mail-Adressen aktualisieren möchten.

Bryan Legend
quelle
1
Ich dachte, ich möchte darauf hinweisen, dass wir jetzt eine Kaskade haben, die kein Problem darstellt
Malhal
3

Ein weiterer Grund, warum ein ganzzahliger Primärschlüssel besser ist, besteht darin, dass Sie in einer anderen Tabelle auf die E-Mail-Adresse verweisen. Wenn die Adresse selbst ein Primärschlüssel ist, müssen Sie sie in einer anderen Tabelle als Schlüssel verwenden. So speichern Sie E-Mail-Adressen mehrmals.

klew
quelle
3

Ich bin mit Postgres nicht allzu vertraut. Primärschlüssel ist ein großes Thema. Ich habe auf dieser Website (stackoverflow.com) einige ausgezeichnete Fragen und Antworten gesehen.

Ich denke, Sie können eine bessere Leistung erzielen, wenn Sie einen numerischen Primärschlüssel haben und einen EINZIGARTIGEN INDEX in der E-Mail-Spalte verwenden. E-Mails variieren in der Regel in der Länge und sind möglicherweise nicht für den Primärschlüsselindex geeignet.

hier und hier etwas lesen .

Saif Khan
quelle
3

Persönlich verwende ich beim Entwerfen einer Datenbank keine Informationen für den Primärschlüssel, da es sehr wahrscheinlich ist, dass ich später Informationen ändern muss. Der einzige Grund, warum ich Primärschlüssel zur Verfügung stelle, ist, dass es bequem ist, die meisten SQL-Operationen vom Client aus auszuführen, und ich habe mich immer für den Integer-Typ mit automatischer Inkrementierung entschieden.

tia
quelle
2

Ihr Kollege hat Recht: Verwenden Sie eine automatisch inkrementierende Ganzzahl für Ihren Primärschlüssel.

Sie können die E-Mail-Eindeutigkeit entweder auf Anwendungsebene implementieren oder Ihre E-Mail-Adressspalte als eindeutig markieren und einen Index für diese Spalte hinzufügen.

Das Hinzufügen des Felds als eindeutig kostet den String-Vergleich nur beim Einfügen in diese Tabelle und nicht beim Durchführen von Joins und Fremdschlüssel-Einschränkungsprüfungen.

Natürlich müssen Sie beachten, dass das Hinzufügen von Einschränkungen zu Ihrer Anwendung auf Datenbankebene dazu führen kann, dass Ihre App unflexibel wird. Berücksichtigen Sie dies immer, bevor Sie ein Feld als "eindeutig" oder "nicht null" festlegen, nur weil Ihre Anwendung es als eindeutig oder nicht leer benötigt.

jrharshath
quelle
1
"Berücksichtigen Sie immer die Anforderungen, bevor Sie die Anforderung x implementieren, nur weil Ihre Anwendung die Anforderung x benötigt." - der schlechteste Ratschlag, den ich seit einiger Zeit gelesen habe.
Tag, wenn
Ich bin von Ihrem "Argument" nicht überzeugt - im wirklichen Leben gibt es oft Situationen, in denen einige wichtige Daten (z. B. eine Telefonnummer) nicht sofort verfügbar sind. Wenn ein solches Feld in einer Datenbank als NICHT NULL markiert ist, müssen die Benutzer die Daten mit Dummy-Feldern (wie 123) verschmutzen, anstatt sie leer zu lassen. Es wäre praktischer, die Anwendung die Einschränkungen behandeln zu lassen (und in diesem Fall könnte die App ein leeres Feld als Aktionselement markieren).
Jrharshath
5
Ich bin damit einverstanden, dass die Definition eines Feldes "nicht null" mit Vorsicht erfolgen sollte. Anforderungen wie "Wir brauchen immer die Telefonnummer des Kunden" sollten sorgfältig abgewogen werden. Könnte es manchmal nicht wünschenswert sein, einen Kundendatensatz zu erstellen, obwohl wir die Telefonnummer derzeit nicht kennen, und sie später erneut abzurufen? "Dieses Feld muss eindeutig sein" ist jedoch eine andere Kategorie. Ich kann mir nicht vorstellen zu sagen: "Es ist in Ordnung, wenn zwei Mitarbeiter dieselbe Sozialversicherungsnummer haben. Wir werden es später herausfinden." Wie würden Sie jemals die Daten begradigen?
Jay
1
Be Wolves: Ich kannte einmal eine Frau, die keine eigene Telefonnummer hatte. Was machst du dann?
David Thornley
@ DavidThornley Klingt so, als ob Sie mehr trainieren oder vielleicht ein freundlicheres Verhalten anpassen sollten.
Philip Schiff
2

Verwenden Sie eine GUID als Primärschlüssel. Auf diese Weise können Sie sie aus Ihrem Programm generieren, wenn Sie ein INSERT ausführen, und Sie müssen keine Antwort vom Server erhalten, um herauszufinden, was der Primärschlüssel ist. Es wird auch für alle Tabellen und Datenbanken eindeutig sein, und Sie müssen sich keine Gedanken darüber machen, was passiert, wenn Sie die Tabelle eines Tages abschneiden und das automatische Inkrement auf 1 zurückgesetzt wird.

JoelFan
quelle
2
Verwenden Sie eine GUID, es sei denn, Sie interessieren sich wenig oder gar nicht für die Leistung. Es ist no-no # 1, wenn Sie ein System bauen, das skaliert werden muss
Micah
nein ... siehe davybrion.com/blog/2009/05/…
JoelFan
3
Sagte in wahrer Microsoft-Kool-Aid-Trinkmode!
Gary Chambers
2

Ich weiß, dass dies ein etwas verspäteter Eintrag ist, aber ich möchte hinzufügen, dass Leute E-Mail-Konten aufgeben und Dienstanbieter die Adresse wiederherstellen, damit eine andere Person sie verwenden kann.

Wie @HLGEM betonte "[email protected] kann leicht ein Jahr zu John Smith und zwei Jahre später zu Julia Smith gehören." In diesem Fall müssen Sie, falls John Smith Ihren Service wünscht, entweder die Verwendung seiner E-Mail-Adresse verweigern oder alle Ihre Unterlagen zu Julia Smith löschen.

Wenn Sie Datensätze löschen müssen und diese sich je nach den örtlichen Gesetzen auf die Finanzgeschichte des Unternehmens beziehen, können Sie sich in heißem Wasser befinden.

Daher würde ich niemals Daten wie E-Mail-Adressen, Nummernschilder usw. als Primärschlüssel verwenden, da sie, egal wie eindeutig sie scheinen, außerhalb Ihrer Kontrolle liegen und einige interessante Herausforderungen bieten können, für die Sie möglicherweise keine Zeit haben.

Robert
quelle
2

Möglicherweise müssen Sie alle geltenden Gesetze zur Datenregulierung berücksichtigen. E-Mail ist eine persönliche Information. Wenn Ihre Benutzer beispielsweise EU-Bürger sind, können sie Sie unter DSGVO anweisen, ihre Informationen aus Ihren Unterlagen zu löschen (denken Sie daran, dass dies unabhängig davon gilt, in welchem ​​Land Sie sich befinden).

Wenn Sie den Datensatz selbst aus Gründen der referenziellen Integrität oder aus historischen Gründen wie der Prüfung in der Datenbank aufbewahren müssen, können Sie mit einem Ersatzschlüssel nur das gesamte Feld für persönliche Daten NULL machen. Dies ist offensichtlich nicht so einfach, wenn ihre persönlichen Daten der Primärschlüssel sind

Stuart Parker
quelle
1

Sie können die Leistung steigern, indem Sie einen ganzzahligen Primärschlüssel verwenden.

xport
quelle
1

Sie sollten einen ganzzahligen Primärschlüssel verwenden. Wenn die E-Mail-Spalte eindeutig sein soll, warum setzen Sie nicht einfach einen eindeutigen Index für diese Spalte?

oezi
quelle
1

Wenn Sie einen nicht int-Wert als Primärschlüssel haben, sind Einfügungen und Abfragen bei großen Datenmengen sehr langsam.

Amareswar
quelle
1
Nein, fügt ein, dass es langsamer ist , da Sie zwei eindeutige Indizes benötigen : einen für den generierten Primärschlüssel und einen für die E-Mail-Adresse.
a_horse_with_no_name
1

Primärschlüssel sollte ein statisches Attribut gewählt werden. Da E-Mail-Adressen nicht statisch sind und von mehreren Kandidaten gemeinsam genutzt werden können, ist es keine gute Idee, sie als Primärschlüssel zu verwenden. Darüber hinaus sind E-Mail-Adressen Zeichenfolgen mit einer bestimmten Länge, die möglicherweise größer sind als die eindeutige ID, die wir verwenden möchten [len (email_address)> len (unique_id)], sodass mehr Speicherplatz erforderlich ist und sie im schlimmsten Fall mehrfach als Fremdschlüssel gespeichert werden . Infolgedessen führt dies zu einer Verschlechterung der Leistung.

user2719152
quelle
0

Es kommt auf den Tisch an. Wenn die Zeilen in Ihrer Tabelle E-Mail-Adressen darstellen, ist E-Mail die beste ID. Wenn nicht, ist E-Mail keine gute ID.

Lajos Arpad
quelle
0

Wenn es lediglich darum geht, dass die E-Mail eindeutig sein muss, können Sie mit dieser Spalte einfach einen eindeutigen Index erstellen.

Micah
quelle
0

E-Mail ist ein guter eindeutiger Indexkandidat, jedoch nicht für den Primärschlüssel. Wenn es sich um einen Primärschlüssel handelt, können Sie beispielsweise die E-Mail-Adresse des Kontakts nicht ändern. Ich denke, Ihre Join-Abfragen werden auch langsamer sein.

Chocolim
quelle
0

Verwenden Sie die E-Mail-Adresse nicht als Primärschlüssel, behalten Sie die E-Mail als eindeutig bei, verwenden Sie sie jedoch nicht als Primärschlüssel, verwenden Sie die Benutzer-ID oder den Benutzernamen als Primärschlüssel

Nikki
quelle