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.