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
.
sql
database
database-design
postgresql
Robert
quelle
quelle
Antworten:
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.
quelle
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).
quelle
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.
quelle
Nachteile der Verwendung einer E-Mail-Adresse als Primärschlüssel:
Langsamer beim Zusammenfügen.
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.)
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:
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.
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.
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.
quelle
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.
quelle
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.
quelle
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.quelle
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,
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 ...)
quelle
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:
quelle
Ja, es ist ein schlechter Primärschlüssel, da Ihre Benutzer ihre E-Mail-Adressen aktualisieren möchten.
quelle
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.
quelle
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 .
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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
quelle
Sie können die Leistung steigern, indem Sie einen ganzzahligen Primärschlüssel verwenden.
quelle
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?
quelle
Wenn Sie einen nicht int-Wert als Primärschlüssel haben, sind Einfügungen und Abfragen bei großen Datenmengen sehr langsam.
quelle
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.
quelle
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.
quelle
Wenn es lediglich darum geht, dass die E-Mail eindeutig sein muss, können Sie mit dieser Spalte einfach einen eindeutigen Index erstellen.
quelle
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.
quelle
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
quelle