20 Stimmen

Gründe, die gegen die Verwendung einer automatisch inkrementierenden Zahl für einen Primärschlüssel sprechen

Ich arbeite derzeit an der Datenbank eines anderen Unternehmens, in der die Primärschlüssel über eine Nachschlagetabelle generiert werden, die eine Liste von Tabellennamen und den zuletzt verwendeten Primärschlüssel enthält. Eine gespeicherte Prozedur erhöht diesen Wert und prüft, ob er eindeutig ist, bevor sie ihn an die aufrufende "insert"-SP zurückgibt.

Welche Vorteile hat die Verwendung einer solchen Methode (oder das Generieren einer GUID) anstelle der Verwendung der Identitäts-/Autonummer?

Ich spreche nicht von Primärschlüsseln, die tatsächlich etwas "bedeuten", wie ISBNs oder Produktcodes, sondern nur von den eindeutigen Bezeichnern.

Danke.

1voto

Grank Punkte 5173

Für die meisten Szenarien, in denen die derzeitige Methode sinnvoll ist, würde ich eine GUID vorziehen (Replikation ist ein mögliches Szenario). Wenn es um Replikation ginge, müsste eine solche gespeicherte Prozedur den anderen Server kennen, der verknüpft werden müsste, um die Eindeutigkeit des Schlüssels zu gewährleisten, was sie sehr spröde und wahrscheinlich eine schlechte Methode wäre.
Eine Situation, in der ich Integer-Primärschlüssel verwende, die NICHT automatisch inkrementierende Identitäten sind, ist der Fall von selten geänderten Nachschlagetabellen, die Fremdschlüsselbeschränkungen erzwingen, die eine entsprechende Aufzählung in der datenverarbeitenden Anwendung haben werden. In diesem Szenario möchte ich sicherstellen, dass die Enum-Zuordnung zwischen Entwicklung und Bereitstellung korrekt ist, vor allem, wenn es mehrere Produktivserver gibt.

1voto

bobince Punkte 512550

Ein weiterer möglicher Grund ist, dass Sie absichtlich zufällige Schlüssel wünschen. Dies kann wünschenswert sein, wenn Sie z. B. nicht wollen, dass neugierige Browser jedes Element in Ihrer Datenbank durchblättern, aber es ist nicht kritisch genug, um tatsächliche Sicherheitsmaßnahmen zur Authentifizierung zu rechtfertigen.

1voto

Kevin Fairchild Punkte 10701

Mein Hauptproblem mit automatisch inkrementierenden Schlüsseln ist, dass sie keine Bedeutung haben.

Für Tabellen, bei denen bestimmte Felder Eindeutigkeit bieten (sei es allein oder in Kombination mit einem anderen), würde ich mich stattdessen dafür entscheiden.

0 Stimmen

Ich bin der Meinung, dass jede Tabelle einen "aussagekräftigen" Schlüssel haben sollte, aber wenn es sich nicht um einen einzelnen integralen Attributwert handelt (was selten der Fall ist), ist es einfach ein zu großer Performance-Hit, um ihn für FKs und relationale Joins zu verwenden... Daher versuche ich immer, jeder Tabelle zwei eindeutige Schlüssel zuzuordnen, einen autoNum-Schlüssel und einen aussagekräftigen Schlüssel.

2 Stimmen

Ich glaube nicht, dass es immer gut ist, wenn PKs eine Bedeutung haben. Wenn sie eine Bedeutung haben, verlässt man sich darauf, dass sich die Geschäftsregeln nicht so ändern, dass es doppelte Werte geben kann. Bei "bedeutungslosen" PKs ist dies kein Problem.

0 Stimmen

...daher die Formulierung "wenn bestimmte Felder für Einzigartigkeit sorgen". Ich glaube nicht, dass es nur das eine oder das andere gibt.

0voto

MusiGenesis Punkte 72729

Ein nützlicher Nebeneffekt der Verwendung eines GUID-Primärschlüssels anstelle eines automatisch inkrementierenden Schlüssels besteht darin, dass Sie den PK-Wert für eine neue Zeile auf der Client-Seite zuweisen können (in einem Replikationsszenario müssen Sie dies sogar tun), wodurch Sie sich die Mühe ersparen, den PK-Wert der Zeile, die Sie gerade hinzugefügt haben, auf dem Server abzurufen.

Einer der Nachteile einer GUID-PK ist, dass Joins über ein GUID-Feld langsamer sind (es sei denn, dies hat sich kürzlich geändert). Ein weiterer Vorteil der Verwendung von GUIDs ist, dass es Spaß macht, einem nicht-technischen Manager zu erklären, warum eine GUID-Kollision eher unwahrscheinlich ist.

0voto

Alex Punkte 32100

Die Antwort von Galwegian ist nicht unbedingt richtig.

Bei MySQL können Sie für jede Datenbankinstanz einen Schlüssel-Offset festlegen. Wenn Sie dies mit einem ausreichend großen Inkrement kombinieren, ist das in Ordnung. Ich bin sicher, andere Anbieter haben ähnliche Einstellungen.

Nehmen wir an, wir haben 2 Datenbanken, die wir replizieren wollen. Wir können dies auf folgende Weise einrichten.

increment = 2
db1 - offset = 1
db2 - offset = 2

Dies bedeutet, dass

db1 hat die Tasten 1, 3, 5, 7....

db2 hat die Schlüssel 2, 4, 6, 8....

Daher werden wir keine Schlüsselüberschneidungen bei den Beilagen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X