Fremdschlüssel - Verknüpfung mit Ersatz- oder natürlichem Schlüssel?


14

Gibt es eine bewährte Methode für die Verknüpfung eines Fremdschlüssels zwischen Tabellen mit einem natürlichen Schlüssel oder einem Ersatzschlüssel? Die einzige Diskussion, die ich wirklich gefunden habe (es sei denn, mein Google-Fu fehlt), ist Jack Douglas 'Antwort auf diese Frage , und seine Argumentation scheint mir richtig zu sein. Ich bin mir der Diskussion darüber bewusst, dass sich diese Regeln ändern, aber dies müsste in jeder Situation berücksichtigt werden.

Der Hauptgrund für die Frage ist, dass ich eine Legacy-Anwendung habe, die FKs mit natürlichen Schlüsseln verwendet, aber es gibt einen starken Druck von Entwicklern, zu einem OR / M (in unserem Fall NHibernate) überzugehen, und eine Gabel hat bereits einige produziert Ich möchte die Änderungen entweder mit dem natürlichen Schlüssel wieder auf den richtigen Weg bringen oder die Legacy-App verschieben, um Ersatzschlüssel für den FK zu verwenden. Mein Bauch sagt, dass ich die ursprüngliche FK wiederherstellen soll, aber ich bin ehrlich gesagt nicht sicher, ob dies wirklich der richtige Weg ist.

Die Mehrheit unserer Tabellen hat bereits einen Ersatz- und einen natürlichen Schlüssel definiert (obwohl eindeutige Einschränkung und PK), so dass das Hinzufügen zusätzlicher Spalten für uns in dieser Insance kein Problem darstellt. Wir verwenden SQL Server 2008, aber ich hoffe, dass dies für jede Datenbank allgemein genug ist.

Antworten:


15

Weder SQL noch das relationale Modell werden durch Fremdschlüssel gestört, die auf einen natürlichen Schlüssel verweisen. Tatsächlich verbessert das Referenzieren von natürlichen Schlüsseln häufig die Leistung erheblich. Sie wären überrascht, wie oft die von Ihnen benötigten Informationen vollständig in einem natürlichen Schlüssel enthalten sind. Wenn Sie auf diesen Schlüssel verweisen, wird ein Join für eine breitere Tabelle getauscht (und folglich die Anzahl der Zeilen, die Sie auf einer Seite speichern können, verringert).

Per Definition sind die benötigten Informationen immer vollständig im natürlichen Schlüssel jeder Nachschlagetabelle enthalten. (Der Begriff Nachschlagetabelle ist informell. Im relationalen Modell sind alle Tabellen nur Tabellen. Eine Tabelle mit US-Postleitzahlen enthält möglicherweise folgende Zeilen: {AK, Alaska}, {AL, Alabama}, {AZ, Arizona} usw. Die meisten Leute würden das eine Nachschlagetabelle nennen.)

Auf großen Systemen ist es nicht ungewöhnlich, Tabellen mit mehr als einem Kandidatenschlüssel zu finden. Es ist auch nicht ungewöhnlich, dass Tabellen, die einen Teil des Unternehmens bedienen, auf einen Kandidatenschlüssel verweisen, und Tabellen, die einen anderen Teil des Unternehmens bedienen, auf einen anderen Kandidatenschlüssel verweisen. Dies ist eine der Stärken des relationalen Modells, und es ist Teil des relationalen Modells, das SQL ziemlich gut unterstützt.

Sie werden auf zwei Probleme stoßen, wenn Sie auf natürliche Schlüssel in Tabellen verweisen, die auch einen Ersatzschlüssel enthalten.

Zuerst wirst du die Leute überraschen. Obwohl ich mich normalerweise stark für das Prinzip der geringsten Überraschung engagiere , ist dies eine Situation, in der es mir nichts ausmacht, Menschen zu überraschen. Wenn das Problem darin besteht, dass Entwickler von der logischen Verwendung von Fremdschlüsseln überrascht sind, lautet die Lösung "Bildung" und nicht "Neugestaltung".

Zweitens orientieren sich ORMs im Allgemeinen nicht am relationalen Modell, und manchmal verkörpern sie Annahmen, die nicht die besten Praktiken widerspiegeln. (Tatsächlich scheinen sie oft so gestaltet zu sein, dass sie nie von einem Datenbankexperten eingegeben wurden.) Die Anforderung einer ID-Nummer in jeder Tabelle ist eine dieser Annahmen. Ein anderer geht davon aus, dass die ORM-Anwendung die Datenbank "besitzt". (Es ist also kostenlos, Tabellen und Spalten zu erstellen, zu löschen und umzubenennen.)

Ich habe an einem Datenbanksystem gearbeitet, das über einen Zeitraum von 30 Jahren Daten für Hunderte von Anwendungsprogrammen lieferte, die in mindestens zwei Dutzend Sprachen geschrieben waren. Diese Datenbank gehört dem Unternehmen, nicht einem ORM.

Eine Gabel, die Änderungen einführt, sollte ein Show-Stopper sein.

In einem Unternehmen, in dem ich früher gearbeitet habe, habe ich die Leistung sowohl mit natürlichen Schlüsseln als auch mit Ersatzschlüsseln gemessen. Es gibt einen Wendepunkt, an dem Ersatzschlüssel anfangen, natürliche Schlüssel zu übertreffen. (Unter der Annahme, dass keine zusätzlichen Anstrengungen unternommen werden, um die Leistung natürlicher Schlüssel hoch zu halten, wie Partitionierung, Teilindizes, funktionsbasierte Indizes, zusätzliche Tabellenbereiche, Verwendung von Solid-State-Datenträgern usw.) Nach meinen Schätzungen für dieses Unternehmen werden sie diesen Wendepunkt in erreichen um 2045. In der Zwischenzeit erzielen sie mit natürlichen Schlüsseln eine bessere Leistung.

Andere relevante Antworten: Im Datenbankschema Verwirrend


5

Der Hauptgrund, warum ich Ersatzschlüssel unterstütze, ist, dass natürliche Schlüssel häufig Änderungen unterliegen und das bedeutet, dass alle zugehörigen Tabellen aktualisiert werden müssen, was den Server erheblich belasten kann.

In den 30 Jahren, in denen ich eine Vielzahl von Datenbanken zu vielen Themen verwendet habe, ist der wahre natürliche Schlüssel häufig ziemlich selten. Dinge sind angeblich eindeutig (SSN), Dinge, die zu einem bestimmten Zeitpunkt eindeutig sind, können später nicht eindeutig werden, und einige Dinge wie E-Mail-Adressen und Telefonnummern können eindeutig sein, aber sie können später für verschiedene Personen wiederverwendet werden Datum. Natürlich haben manche Dinge einfach keine eindeutige Kennung wie die Namen von Personen und Unternehmen.

So vermeiden Sie Verknüpfungen mithilfe eines natürlichen Schlüssels. Ja, dies kann die select-Anweisungen beschleunigen, für die keine Joins erforderlich sind, führt jedoch dazu, dass die Stellen, an denen Sie die Joins noch benötigen, langsamer werden, da int-Joins im Allgemeinen schneller sind. Es wird wahrscheinlich auch das Einfügen und Löschen verlangsamen und bei Aktualisierungen zu Leistungsproblemen führen, wenn sich der Schlüssel ändert. Komplexe Abfragen (die ohnehin langsamer sind) werden noch langsamer. Einfache Abfragen sind also schneller, aber die Berichterstellung und komplexe Abfragen sowie viele Aktionen für die Datenbank können langsamer sein. Es ist ein Balanceakt, der je nach Art der Datenbankabfrage in die eine oder andere Richtung weist.

Es gibt also keine einheitliche Antwort. Dies hängt von Ihrer Datenbank ab und davon, wie diese abgefragt wird und welche Art von Informationen darin gespeichert sind. Möglicherweise müssen Sie einige Tests durchführen, um herauszufinden, was in Ihrer eigenen Umgebung am besten funktioniert.


1
"... natürliche Schlüssel können sich oft ändern ..." - dann sind sie keine besonders guten Schlüssel! Wenn sich ein Attribut häufig ändert, verwenden Sie es nicht als Schlüssel (für verschiedene Definitionen von "häufig" natürlich). Fabian Pascal argumentierte, dass es vier Kriterien für die Auswahl eines Schlüssels gibt: Vertrautheit, Irreduzibilität, Stabilität und Einfachheit. Manchmal tauscht man diese gegen die Einfachheit eines Ersatzschlüssels aus. Wie HLGEM es ausdrückte: "Es gibt also keine einheitliche Antwort."
Greenstone Walker

1
@GreenstoneWalker, ich stimme zu, dass Sie es dann nicht als Schlüssel festlegen sollten, aber häufig haben Sie keinen Schlüssel, der allen vier Kriterien entspricht, und Sie müssen sich für das entscheiden, was einzigartig ist. Und wenn die Eindeutigkeit ein zusammengesetzter Schlüssel ist, kann das Problem in Bezug auf die Leistung sogar noch größer sein, wenn Sie die Verknüpfungen benötigen.
HLGEM

-4

Wenn Sie die Antwort nicht kennen, gehen Sie mit der Leihmutter. Hier ist der Grund: Wenn Annahmen zu Geschäftsregeln getroffen werden und diese Annahmen falsch sind oder sich die Regeln ändern, handelt es sich bei Ihren Daten um Müll. Hier ist ein Beispiel:

Person, Rolle, PersonRole

Die aktuelle Geschäftsregel besagt, dass eine Person eine Rolle hat. Sie erstellen eine Tabelle, die Person und Rolle mit PersonRole verknüpft (PersonName, PersonBirthDate, PersonMotherMaidenName, ..., RoleCode).

Jetzt sind Sie ein wahrer Purist, wenn es um Natural Keys geht! Aber im Ernst, was ist, wenn die Organisation entscheidet, dass eine Person jetzt mehrere Rollen übernehmen kann? Welche nachgelagerten Auswirkungen hat die Unterstützung der veränderten Geschäftsanforderungen?


2
Und haben Sie diese Probleme nicht mit Ersatzschlüsseln? Bitte zeigen Sie uns wie.
Colin 't Hart

4
Das angeführte Beispiel scheint nichts für die Diskussion Relevantes aufzuzeigen.
Mustaccio
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.