Das nervt mich schon eine Weile. Wenn es darum geht, Daten in Strukturen wie Hashtabellen, Programmierern, Büchern und Artikeln zu speichern, besteht die meiste Zeit darauf, dass das Indizieren von Elementen in diesen Strukturen nach String-Werten als schlechte Praxis angesehen wird. Bisher habe ich jedoch keine einzige solche Quelle gefunden, um zu erklären, warum dies als schlechte Praxis angesehen wird. Kommt es auf die Programmiersprache an? Auf dem zugrunde liegenden Rahmen? Auf die Umsetzung?
Nehmen Sie zwei einfache Beispiele, wenn es hilft:
Eine SQL-ähnliche Tabelle, in der Zeilen durch einen String-Primärschlüssel indiziert werden.
Ein .NET-Wörterbuch, in dem die Schlüssel Zeichenfolgen sind.
username
der Primärschlüssel einerusers
Tabelle wahrscheinlich nicht die beste Idee, und Sie würden eine automatische Inkrementierungs-ID bevorzugen. Aber dasusername
ist eine Zeichenfolge ist nur zufällig, eine veränderbare Eigenschaft ist das HauptproblemAntworten:
Alles hat im Grunde genommen mit den beiden Dingen zu tun:
1) Die Suchgeschwindigkeit (wo zum Beispiel ganze Zahlen viel besser abschneiden)
2) Die Größe der Indizes (wo String-Indizes explodieren würden)
Jetzt hängt alles von Ihren Anforderungen und der Größe des Datensatzes ab. Wenn eine Tabelle oder eine Auflistung 10-20 Elemente enthält, ist der Typ des Schlüssels irrelevant. Es wird sehr schnell auch mit einem String-Schlüssel sein.
PS: Möglicherweise hat dies nichts mit Ihrer Frage zu tun, aber Guids gelten auch für Datenbankschlüssel als schlecht (16-Byte-Guid vs. 4-Byte-Ganzzahl). Bei großen Datenmengen verlangsamen Guids die Suche.
quelle
Es gibt ein weiteres Problem bei der Verwendung von Zeichenfolgen als Schlüssel oder genauer gesagt bei der Verwendung von Zeichenfolgenliteralen als Schlüssel, wobei reine Leistungs- / Effizienzgründe außer Acht gelassen werden. Tippfehler. Wenn Sie Zeichenfolgenliterale als Schlüssel in einem Wörterbuch verwenden, können Sie sich auf eine böse Überraschung einstellen, wenn einer
"ReceiverId"
zu einem wird"RecieverId"
. Richten Sie Konstanten ein, um die Schlüsselwerte zu speichern und sie bei jedem Zugriff auf das Wörterbuch wiederzuverwenden.Sie können sagen, dass eine erstaunliche Anzahl von .NET-Codebeispielen im Web String-Literale verwendet, die diese zweifelhafte Praxis verbreiten. ASP.NET mit all den Sitzungen, ViewStates und QueryParams, die über die Codebasis verstreut sind, ist hier besonders schuldig.
quelle
"1"
und"1 "
in der gleichen Tabelle gibt.Hier gibt es viele Kompromisse. Eigentlich verwende ich häufig String-Schlüssel, aber oft füge ich Ersatz-Sekundärschlüssel für Joins hinzu (offensichtlich wäre es umgekehrt, wenn ich MySQL verwenden würde). Es gibt Fälle, in denen ich es jedoch nicht tue.
Zunächst bin ich ein Fan von natürlichen Schlüsseln als Primärschlüssel, mit denen die Datenbank gut umgehen kann (zum Beispiel PostgreSQL). Dies hilft bei der Normalisierung und sorgt für ein klareres Datenbankdesign. Ersatzschlüssel erleichtern das Beitreten.
Es gibt zwei Gründe, warum ich normalerweise Ersatzschlüssel hinzufüge:
Es ist nicht immer klar, was ein natürlicher Schlüssel ist. Manchmal müssen diese geändert werden. Das Ändern eines natürlichen, zusammengesetzten Schlüssels, wenn er für Verknüpfungen und referenzielle Integrität verwendet wird, ist kompliziert und fehleranfällig.
Die Verbindungsleistung bei zusammengesetzten Schlüsseln ist problematisch, und wenn Sie sich erst einmal auf dem natürlichen Schlüsselweg befinden, bleiben Sie dort stecken.
In Fällen, in denen ein natürlicher Schlüssel eine Definition, eine einzelne Spalte und ein Text ist, füge ich normalerweise den Zeichenfolgenschlüssel hinzu. Mein Grund dafür ist, dass dies häufig vermeidet, beim Nachschlagen mitzumachen. Die häufigste Verwendung ist die Bereitstellung eines geeigneten Datenbankentwurfs für den Anwendungsfall von Aufzählungstypen. In den meisten Fällen ist für Routineabfragen kein zusätzlicher Join erforderlich. Wo dies der Fall ist, sind String-Schlüssel als Join-Schlüssel absolut sinnvoll.
Beispielsweise speichern wir in LedgerSMB Konto-Kategorisierungen. Diese werden durch eine Zeichenfolgenreferenz identifiziert. Einige andere Daten werden mit der Zeichenfolgenreferenz gespeichert, die zur Durchsetzung von Regeln in Bezug auf die Kombinationen von Kategorisierungen verwendet wird, die sich auf ein Konto auswirken können. Die einzige Zeit, in der Logik benötigt wird, ist das Speichern einer Reihe von Kategorisierungen, sodass wir uns dem Zeichenfolgenschlüssel anschließen.
Ich glaube nicht, dass es nur um die Indexgröße geht, warum die Standardeinstellung Ganzzahlschlüssel ist. Ein großes Problem ist die Verwaltung von Schlüsseln. Da der Schlüssel willkürlich ist und Sie möglicherweise mit Millionen von Datensätzen zu tun haben, müssen Sie die Möglichkeit haben, eindeutige Zeichenfolgen zu generieren. Es gibt Fälle, in denen Benutzer UUIDs verwenden, die Wahrscheinlichkeit einer UUID-Kollision jedoch ungleich Null ist. Wenn Milliarden von Datensätzen gespeichert sind, ist diese Wahrscheinlichkeit so hoch, dass sie tatsächlich angezeigt wird, während die Wahrscheinlichkeit einer Kollision mit inkrementierten Ganzzahltypen Null beträgt per Definition.
quelle
Es gibt eine Reihe potenzieller Probleme bei der Verwendung von Zeichenfolgen als Schlüssel, insbesondere bei SQL-ähnlichen Tabellen. Wie von @bunny erwähnt, werden die Indizes für Ihre Tabellen größer sein, aber ich denke, dass Fremdschlüsselbeziehungen zur Tabelle BEIDE Tabellen enthalten, die die Zeichenfolge enthalten, im Gegensatz zu einer leichteren (Ganzzahl-) Kennung . Wenn Sie feststellen, dass es noch mehr Tabellen mit Verweisen auf die erste gibt, werden die Zeichenfolgenschlüssel in Ihrer gesamten Datenbank verbreitet.
quelle
Es ist an und für sich keine schlechte Idee, im Nachhinein ist es normalerweise ein schlechter Designkompromiss. Die Flexibilität und Bandbreite der Saiten im Vergleich zu den zusätzlichen Kosten und der Komplexität.
Wenn der Jobbereich ganzzahlig ist und der Großteil der teuren Verarbeitung nicht wissen muss, was die Ganzzahl darstellt, verwenden Sie eine.
quelle
Sie haben irgendwie die falschen Daten aus einer Hashtabelle abgerufen.
Meinten Sie "DaytimeTelephone" oder "EveningTelephone"?
oder
Meinten Sie 1234567 oder 1234576?
Während Zahlen für die Maschine wahrscheinlich effizienter sind , liegt es an Ihnen und mir , zu verstehen, was passiert ist, und zu diesem Zeitpunkt ein paar Bytes an Speicherplatz zu sparen ein paar Mikro (nano?) - Sekunden der Verarbeitung verliert aus Klarheit jedes einzelne Mal.
quelle
Viele Kompromisse und keine richtige Antwort. Viele Programmierer würden niemals in Betracht ziehen, Zeichenfolgenschlüssel in der Datenbank zu verwenden, da sie sich nicht mit Hashing und der Funktionsweise einer Datenbank auskennen. Saitentasten sind unter vielen Umständen eine gute Wahl, wenn sie extrem stabil oder bedeutungslos sind (Ersatztasten).
quelle
string key ist sinnvoll, wenn es um Nachschlagetabellen mit etwa 10-100 kurzen Zeichenfolgendatensätzen geht. zugehörige Daten sind besser lesbar + zB Änderungsverfolgung (numerische ID / Guid-ID vs. Zeichenfolge, zB "Administrator"); Übrigens verwendet die ASP.NET-Mitgliedschaftsdatenbank Zeichenfolgenschlüssel für AspNetRoles.
quelle