2009-07-01 9 views
2

Ich glaube nicht an eine Silver Bullet, aber ich wirklich gerne Sequenzen oder Autonummer Identität Spalten als meine primäre Schlüsselspalten für Datenbanktabellen. Sie sind einzigartig, sie indexieren gut und ich muss mich nicht um Nullwerte kümmern.Wann würden Sie wählen, ein Identitäts-/Autonummer-Feld NICHT als Primärschlüssel zu verwenden?

Auf der anderen Seite scheinen sie in einigen Fällen redundant, wenn es andere eindeutige Spalten in der Tabelle gibt, die denselben Zweck erfüllen könnten. Angenommen, Sie erstellen eine Tabelle, die 9-stellige Postleitzahlen in Stadtzonen abbildet. Das Postleitzahlenfeld könnte genauso gut funktionieren (vorausgesetzt, Sie können das Datenformat und keine Duplizierung von Werten garantieren).

Auf den Punkt: Meine Erfahrung, wie es mit uns allen ist, ist begrenzt. Welche anderen Beispiele aus der Praxis haben dazu geführt, dass die Benutzer nicht wählen, um eine Spalte mit der Autonummer als Primärschlüssel für eine Tabelle zu verwenden, und warum?

Dies ist eine Art "erweitern Sie Ihre Horizonte" Art von Sache für mich, und ich hoffe, ein wenig von Leuten zu lernen, die mit einer Fülle von Datenbanken gearbeitet haben und zwingende Gründe, etwas anderes zu wählen.

Antwort

5

IMHO ist es wichtig, eine Identitätsspalte zu verwenden, da auch die einfachste Tabelle in Zukunft wichtiger werden kann.

Die einzige Zeit, die ich nicht verwenden würde wäre, wo ich eine GUID stattdessen für Umstände verwendet, wo Datensätze auf getrennten Clients erstellt wurden, die dann mit einem zentralen System synchronisiert werden mussten.

+0

Es ist dieses ganze "Du weißt nie" -Ding, das mich erreicht. Ich möchte die Datenbank nicht überdimensionieren (YAGNI), aber gleichzeitig möchte ich auch nicht zurückgehen und mich mit dem Problem auseinandersetzen müssen, nach und nach eine automatische Nummerierungsspalte hinzuzufügen . Es wäre beunruhigend zu entdecken, dass sich unsere Annahmen über eine "grundsolide" Primärschlüsselauswahl als falsch herausstellten, und wir mussten uns auf sie zurückziehen. –

4

eine Verknüpfungstabelle Federn als die naheliegendste Wahl für ein zusammengesetzten Schlüssel

+1

Ja, das sind Paradebeispiele für Tabellen, die mich perplex machen. Ich habe mich selbst dabei erwischt, wie ich diese mit selbstgeschriebenen Spalten auf ihnen modelliert habe und mich dann gefragt habe: "Warum?" Beide Spalten sind einzigartig; Sie sind Fremdschlüssel! Das Hinzufügen einer weiteren Spalte ist überflüssig! –

1

wirklich das einzig Mal in dem Sinne ich denken kann eine Identitätsspalte zu verwenden, wenn die Anzahl der Felder große Primärschlüssel machen erforderlich ist oder wenn das Feld, das der Primärschlüssel ist, wirklich groß ist (wie eine Zeichenfolge mit 20 Zeichen). In allen anderen Fällen bevorzuge ich es, sie nicht zu verwenden.

Das Problem, das niemand über Identitäten aufwirft, ist, was passiert, wenn etwas mit den Daten passiert. Da der Schlüssel nur darauf basiert, wann der Datensatz hinzugefügt wurde, ist das erneute Laden von Daten in eine Tabelle nach einem katastrophalen Ereignis ein echtes Problem. Jetzt sollte das dbms Ihnen helfen und verhindern, dass jemand eine Tabelle abschneidet oder die Werte der Primärschlüssel ändert ... sollte. Dinge passieren, Tabellen werden beschädigt, oder Datenbank-Updates laufen auf Probleme. Mit Identitäts-Primärschlüsseln bleibt plötzlich ein Durcheinander übrig, wenn man versucht herauszufinden, welche Identitätswerte zu welcher Zeile gehören .... warten Sie, bis Sie das nicht können, weil der Identitätswert keine Bedeutung in Bezug auf die Daten hat . Mit einer Handvoll Einsendungen könnten Sie in Ordnung sein, aber wenn Sie beginnen, größere Tabellen mit vielleicht ein paar Millionen Werten zu haben (in unserem Fall etwas mehr als 11 Millionen), wird das in Eile sehr problematisch. Jeder sagt: "Das ist ein schlimmeres Szenario, es wird nie passieren." Das ist bis es so ist.

+1

Was wäre Ihre PK in einem Benutzer-Tabelle? ihre Benutzerkennung? Ich hoffe niemand heiratet und möchte seine User ID ändern, es wäre ein echter Schmerz alle FKs auf die neue User ID umzustellen! –

+0

Um das hinzuzufügen, würde ich sagen, dass, wenn Sie eine Identität verwenden, sollten Sie weitere Einschränkungen auf Ihre "echten" Datenspalten hinzufügen, um die Datenintegrität zu gewährleisten, z. EINZIGARTIGE Einschränkungen usw. In diesem Fall glaube ich, dass Sie die Identitätsspalte einen "Ersatzschlüssel" nennen würden. Natürlich hängt alles davon ab, welche Daten Sie tatsächlich modellieren. – Nathan

+0

Wenn der Schlüssel basierend auf einem externen Problem (Geschäftslogik, Benutzer-Laune, usw.) geändert werden kann, müssen Sie den Schlüssel ersetzen, es sei denn, Sie haben keine FKs oder möchten alle mit dem neuen Wert aktualisieren. –

3

Ich glaube fest an die Verwendung technischer Primärschlüssel fast ausnahmslos, also müsste meine Antwort ... nie sein.

+1

Können Sie klären, was Sie unter "technischer Primärschlüssel" verstehen? –

0

Ein Bereich, in dem ich kein Auto-Nummer-Feld verwendet habe, ist die Definition einer DateDimension-Tabelle als Teil eines Star-Schemas. In diesem Fall habe ich eine Ganzzahl verwendet, die das Datum im JJJJMMT-Format darstellt. Dies ermöglichte schnelle Joins zwischen der zentralen Faktentabelle und der DateDimension (wie es auch bei einer ID-Spalte mit automatischer Nummer der Fall wäre). Jedoch ...

Die Tabelle DateDimension enthielt andere Datumsdarstellungen (z. B. smalldatetime Spalte, dayOfWeek Spalte usw.). Wenn Benutzer nur das Datum im Format JJJJMMTT haben wollten, war die Verknüpfung nicht erforderlich, da der Schlüssel für die Datumsdimension in der zentralen Faktentabelle diese Information bereits gespeichert hat.

Im Allgemeinen bin ich kein großer Fan von Schlüsseln mit Geschäftsinformationen. In der Regel wird die Annahme, die Sie über den Primärschlüssel beim Entwerfen des Schemas treffen, im Laufe der Zeit nicht erfüllt sein und Sie werden sich lösen. In diesem Fall war ich ziemlich sicher, dass das Datum nicht war!

4

meine Faustregel: „wenn du gehst, Aufzeichnungen im normalen Sprachgebrauch hinzuzufügen, verwenden Sie einen autoincrement PK, und wenn es sich um eine statische Tabelle ist, verwenden, was Kennung mehr‚natürlich‘ist“

IOW: Benutzer , Geschichte Aufzeichnungen, Vermögenswerte; Alle erhalten eine Autoinkrement-PK. zip/city, Typ/Beschreibungen, Maschinen-IDs, erhalten in der Regel einen "natürlichen" Schlüssel.

2

Ich vermeide normalerweise auto_increment-Spalten in Situationen, in denen häufige Datendumps/Loads/Merges erforderlich sind und ich Fremdschlüsselbeziehungen habe. Der Versuch, Daten aus zwei Tabelleninstanzen desselben Schemas zusammenzuführen, die automatisch inkrementierende IDs verwenden, ist ein erschreckendes Problem.

Diese Art der Verwendung erscheint nicht für die meisten, aber meine Arbeit umfasst eine Menge Batch-Verarbeitung, bei der jeder Stapel dann in eine Master-Datenbank für spätere Analyse/Verwendung zusammengeführt wird.

+0

Ich denke, in diesen Fällen mit einer UUID als PK würde den Trick tun. – Javier

0

Eine Ausnahme von dem Grundsatz, der von Iain Hoult, Javier und TK ausgedrückt wird, wäre die Verwendung einer Angestelltennummer oder "Ausweisnummer" als PK eines Personaltisches. In diesem Fall kann der PK nur als "sinnvoller Schlüssel" bezeichnet werden, weil wir dem Mitarbeiter den PK seines Personalausweises übergeben haben.

-Al.