Sind Fremdschlüssel in einem Datenbankdesign wirklich notwendig?

109

Soweit ich weiß, werden Fremdschlüssel (FK) verwendet, um dem Programmierer zu helfen, Daten auf die richtige Weise zu bearbeiten. Angenommen, ein Programmierer tut dies tatsächlich bereits auf die richtige Weise. Brauchen wir dann wirklich das Konzept der Fremdschlüssel?

Gibt es andere Verwendungszwecke für Fremdschlüssel? Vermisse ich hier etwas?

Niyaz
quelle
2
Dies kommt hier oft vor. Ich beschuldige Joel Spolsky :-). Hier gibt es viele gute Antworten; Anstatt meine erneut einzugeben, gebe ich Ihnen nur einen Link: stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys
SquareCog
70
"Angenommen, ein Programmierer macht das tatsächlich schon richtig" - ich kann mir ein solches Szenario nicht einmal vorstellen.
rekursiv
11
"Fremdschlüssel" ist eine Idee, keine Technologie. Es ist eine relationale Regel. Bei Ihrer Frage geht es wirklich darum, ob Sie versuchen sollten, die Regel in Ihrem Code durchzusetzen, oder ob Sie sich von der Datenbank helfen lassen sollten. Wenn es sich um Parallelität handelt, lassen Sie das Datenbankmodul die Regel am besten durchsetzen, da es ALLES weiß, was in der Datenbank passiert, während Ihr Code möglicherweise nichts davon wissen kann.
Triynko
5
@lubos & cdeszaq. Tatsächlich handelt es sich um eine relationale Regel ... es handelt sich um eine Teilmenge von Regel 10 von Codds "Twleve Commandments" ... "Integrity Independence", die im Grunde besagt, dass die relationale Integrität des RDBMS unabhängig von jeder Anwendung, die darauf zugreift, aufrechterhalten werden muss ist genau das, was ich auf leicht verständliche Weise erklärt habe. Diese Regel wird unter anderem durch Fremdschlüsseleinschränkungen implementiert. Also ja, die Idee eines Fremdschlüssels ist "eine" relationale Regel.
Triynko
1
@lubos: Zur Verdeutlichung sprechen Sie darüber, ob Sie eine bestimmte Funktion verwenden möchten oder nicht, aber ich spreche darüber, ob die Anwesenheit dieser Funktion erforderlich ist, um ein vollständiges, voll funktionsfähiges RDBMS zu haben. Referenzielle Einschränkungen sollten, wenn Sie sie verwenden möchten, innerhalb des RDBMS (und nicht innerhalb der Anwendung) erzwungen werden. Daher sollte diese Funktion vorhanden sein, und in diesem Sinne ist sie eine Anforderung des relationalen Modells, wenn Sie werden ein vollständiges RDBMS entwickeln.
Triynko

Antworten:

102

Fremdschlüssel helfen dabei, die referenzielle Integrität auf Datenebene durchzusetzen. Sie verbessern auch die Leistung, da sie normalerweise standardmäßig indiziert sind.

John Topley
quelle
52
Wenn Sie einen Index erstellen müssen, sollte dies kein Hauptgrund für FKs sein. (Unter bestimmten Umständen (z. B. mehr Einfügungen als ausgewählte) kann die Aufrechterhaltung einer FK langsamer sein.)
Robert
7
Das ist eine schreckliche Antwort. FKs können im Allgemeinen zusätzlichen Overhead hinzufügen und nicht die Leistung verbessern.
Agile Jedi
In SQL-Server werden sie weder vom Schiedsrichter noch vom Referrer standardmäßig indiziert. sqlskills.com/blogs/kimberly/…
user420667
1
Noch in Oracle; Sie müssen selbst Indizes (für die FK-Spalten) erstellen.
Littlefoot
58

Fremdschlüssel können dem Programmierer auch helfen, weniger Code mit Dingen wie zu schreiben ON DELETE CASCADE. Dies bedeutet, dass wenn Sie eine Tabelle mit Benutzern und eine andere mit Bestellungen oder Ähnlichem haben, das Löschen eines Benutzers automatisch alle Bestellungen löschen kann, die auf diesen Benutzer verweisen.

Greg Hewgill
quelle
3
@ Greg Hewgill Dies könnte möglicherweise zu vielen Problemen führen. Sie sollten sehr vorsichtig mit Gedanken wie DELETE CASCADE umgehen, da Sie in vielen Fällen die von einem Benutzer erstellten Bestellungen beim Löschen des Benutzers beibehalten möchten.
Kibbee
8
Obwohl dies wahrscheinlich in der Geschäftslogikschicht behandelt werden sollte. Die Entscheidung, ob verwandte untergeordnete Aufzeichnungen geführt werden sollen oder nicht, entspricht nicht der Sicherstellung, dass keine Werte gegen Fremdschlüsselbeziehungen verstoßen.
Codewerks
5
Das andere Problem ist die Überwachung. Wenn die Überwachung nicht auf DB-Ebene durchgeführt wird, wird Ihr Überwachungspfad durch kaskadierende Aktualisierungen oder Löschungen ungültig.
Si618
@Codewerks: Geschäftslogik kann in der DB sein.
Fantius
44

Ich kann mir nicht vorstellen, eine Datenbank ohne Fremdschlüssel zu entwerfen. Ohne sie müssen Sie möglicherweise einen Fehler machen und die Integrität Ihrer Daten beschädigen.

Sie sind streng genommen nicht erforderlich , aber die Vorteile sind enorm.

Ich bin ziemlich sicher, dass FogBugz keine Fremdschlüsseleinschränkungen in der Datenbank hat. Es würde mich interessieren, wie das Fog Creek Software- Team seinen Code strukturiert, um sicherzustellen, dass niemals Inkonsistenzen auftreten.

Eric Z Bart
quelle
43
Joel: Bisher hatten wir noch nie ein Problem. Bisher bin ich noch nie in einen Laternenpfahl gefahren. Aber ich denke immer noch, dass es eine gute Idee ist, Sicherheitsgurte anzulegen ;-)
Tony Andrews
2
Vielleicht haben Sie das Problem noch nie gesehen, aber vielleicht ist es da ... Die meisten Datenbanken verwenden eine Konvention wie id_xxx, die genau der gleichen entspricht wie ixXXX
FerranB
1
@Joel: Namenskonventionen anstelle der Durchsetzung von Regeln? Könnte auch den Typ abschaffen, während Sie gerade dabei sind.
JCollum
8
@Eric: Sie halten Fog Creek hier als eine Art Avatar der Softwareentwicklung hoch. Wenn Sie sagten "Eine Firma in New York City hat keine Fremdschlüssel in ihrer Datenbank ...", würden wir alle sagen "Und?"
JCollum
3
Eric: FogBugz verwendet eine Namenskonvention für Fremdschlüssel. Zum Beispiel wird ixBug als Index in den Primärschlüssel der Tabelle Bug verstanden. Bisher hatten wir noch nie ein Problem. - Joel Spolsky
Sam Saffron
40

Ein Datenbankschema ohne FK-Einschränkungen ist wie das Fahren ohne Sicherheitsgurt.

Eines Tages wirst du es bereuen. Wenn Sie nicht so wenig zusätzliche Zeit für die Grundlagen des Designs und die Datenintegrität aufwenden, können Sie später sicher Kopfschmerzen bekommen.

Würden Sie Code in Ihrer Anwendung akzeptieren, der so schlampig war? Das hat direkt auf die Mitgliedsobjekte zugegriffen und die Datenstrukturen direkt geändert.

Warum ist dies Ihrer Meinung nach in modernen Sprachen schwierig und sogar inakzeptabel geworden ?

Kerl
quelle
2
+1 für eine gute Analogie zwischen Kapselung und FK / PK-Beziehungen.
JCollum
21

Ja.

  1. Sie halten dich ehrlich
  2. Sie halten neue Entwickler ehrlich
  3. Du kannst tun ON DELETE CASCADE
  4. Sie helfen Ihnen dabei, schöne Diagramme zu erstellen, die die Verknüpfungen zwischen Tabellen selbst erklären
csmba
quelle
1
Was meinst du mit Ehrlichkeit?
dspacejs
Ehrlich mit der Vorstellung, denke ich. Es verhindert, dass Sie mit den Daten betrügen, indem Sie schnell und lahm programmieren.
Oreste Viron
13

Angenommen, ein Programmierer tut dies bereits auf die richtige Weise

Eine solche Annahme zu machen, scheint mir eine äußerst schlechte Idee zu sein; Im Allgemeinen ist Software phänomenal fehlerhaft.

Und genau darum geht es wirklich. Entwickler können die Dinge nicht richtig machen, daher ist es eine gute Sache, sicherzustellen, dass die Datenbank nicht mit schlechten Daten gefüllt werden kann.

Obwohl in einer idealen Welt natürliche Verknüpfungen Beziehungen (dh FK-Einschränkungen) verwenden würden, anstatt mit Spaltennamen übereinzustimmen. Dies würde FKs noch nützlicher machen.

DrPizza
quelle
2
Guter Punkt, es wäre schön, zwei Tabellen mit "ON [Beziehung]" oder einem anderen Schlüsselwort zu verbinden und die Datenbank herausfinden zu lassen, um welche Spalten es sich handelt. Scheint wirklich ziemlich vernünftig.
JCollum
13

Persönlich bin ich für Fremdschlüssel, weil dies die Beziehung zwischen den Tabellen formalisiert. Mir ist klar, dass Ihre Frage voraussetzt, dass der Programmierer keine Daten einführt, die die referenzielle Integrität verletzen würden, aber ich habe viel zu viele Fälle gesehen, in denen die referenzielle Datenintegrität trotz bester Absichten verletzt wird!

Vor-Fremdschlüssel-Einschränkungen (auch als deklarative referenzielle Integrität oder DRI bezeichnet) wurden viel Zeit für die Implementierung dieser Beziehungen mithilfe von Triggern aufgewendet. Die Tatsache, dass wir die Beziehung durch eine deklarative Einschränkung formalisieren können, ist sehr mächtig.

@John - Andere Datenbanken erstellen möglicherweise automatisch Indizes für Fremdschlüssel, SQL Server jedoch nicht. In SQL Server sind Fremdschlüsselbeziehungen nur Einschränkungen. Sie müssen Ihren Index für Fremdschlüssel separat definieren (was von Vorteil sein kann).

Bearbeiten: Ich möchte hinzufügen, IMO, die Verwendung von Fremdschlüsseln zur Unterstützung von ON DELETE oder ON UPDATE CASCADE ist nicht unbedingt eine gute Sache. In der Praxis habe ich festgestellt, dass die Kaskade beim Löschen basierend auf der Beziehung der Daten sorgfältig abgewogen werden sollte - z. B. haben Sie ein natürliches Eltern-Kind, bei dem dies in Ordnung sein kann, oder ist die zugehörige Tabelle eine Reihe von Suchwerten. Wenn Sie kaskadierte Updates verwenden, müssen Sie zulassen, dass der Primärschlüssel einer Tabelle geändert wird. In diesem Fall habe ich eine allgemeine philosophische Meinungsverschiedenheit dahingehend, dass sich der Primärschlüssel einer Tabelle nicht ändern sollte. Schlüssel sollten von Natur aus konstant sein.

Peter Meyer
quelle
9

Wie können Sie ohne Fremdschlüssel feststellen, dass zwei Datensätze in verschiedenen Tabellen verknüpft sind?

Ich denke, Sie beziehen sich auf die referenzielle Integrität, bei der der untergeordnete Datensatz nicht ohne einen vorhandenen übergeordneten Datensatz usw. erstellt werden darf. Diese werden häufig als Fremdschlüsseleinschränkungen bezeichnet - sind jedoch nicht mit dem Vorhandensein von Fremdschlüsseln in zu verwechseln den ersten Platz.

Samjudson
quelle
8

Gibt es einen Vorteil, wenn Sie keine Fremdschlüssel haben? Wenn Sie keine beschissene Datenbank verwenden, sind FKs nicht so schwer einzurichten. Warum sollten Sie sie vermeiden? Es ist eine Sache, eine Namenskonvention zu haben, die besagt, dass eine Spalte auf eine andere verweist, und eine andere, zu wissen, dass die Datenbank diese Beziehung tatsächlich für Sie überprüft.

Tundey
quelle
8

Ich nehme an, Sie sprechen von Fremdschlüsseleinschränkungen, die von der Datenbank erzwungen werden . Sie verwenden wahrscheinlich bereits Fremdschlüssel, Sie haben der Datenbank nur nichts davon erzählt.

Angenommen, ein Programmierer tut dies tatsächlich bereits auf die richtige Weise. Brauchen wir dann wirklich das Konzept der Fremdschlüssel?

Theoretisch nein. Es gab jedoch noch nie eine Software ohne Fehler.

Fehler im Anwendungscode sind normalerweise nicht so gefährlich - Sie identifizieren den Fehler und beheben ihn. Danach läuft die Anwendung wieder reibungslos. Aber wenn ein Fehler zulässt, dass aktuelle Daten in die Datenbank gelangen, bleiben Sie dabei! Es ist sehr schwierig, beschädigte Daten in der Datenbank wiederherzustellen.

Überlegen Sie, ob ein subtiler Fehler in FogBugz das Schreiben eines beschädigten Fremdschlüssels in die Datenbank ermöglichte. Es kann einfach sein, den Fehler zu beheben und den Fix in einer Bugfix-Version schnell an Kunden weiterzuleiten. Wie sollten jedoch die beschädigten Daten in Dutzenden von Datenbanken behoben werden? Der richtige Code kann jetzt plötzlich kaputt gehen, da die Annahmen über die Integrität von Fremdschlüsseln nicht mehr gelten.

In Webanwendungen spricht normalerweise nur ein Programm mit der Datenbank, sodass es nur einen Ort gibt, an dem Fehler die Daten beschädigen können. In einer Unternehmensanwendung können mehrere unabhängige Anwendungen mit derselben Datenbank sprechen (ganz zu schweigen von Personen, die direkt mit der Datenbankshell arbeiten). Es gibt keine Möglichkeit, sicher zu sein, dass alle Anwendungen immer und für immer denselben Fehlern ohne Fehler folgen.

Wenn Einschränkungen in der Datenbank codiert sind, kann das Schlimmste, was bei Fehlern passieren kann, sein, dass dem Benutzer eine hässliche Fehlermeldung angezeigt wird, dass eine SQL- Einschränkung nicht erfüllt ist. Dies ist viel besser, als aktuelle Daten in Ihre Unternehmensdatenbank zu lassen, wo sie wiederum alle Ihre Anwendungen beschädigen oder einfach zu allen Arten von falschen oder irreführenden Ausgaben führen.

Oh, und Fremdschlüsseleinschränkungen verbessern auch die Leistung, da sie standardmäßig indiziert sind. Ich kann mir keinen Grund vorstellen , keine Fremdschlüsseleinschränkungen zu verwenden.

JacquesB
quelle
7

FKs sind sehr wichtig und sollten immer in Ihrem Schema vorhanden sein, es sei denn, Sie sind eBay .

Cherouvim
quelle
2
Dieser Link ist wirklich äußerst faszinierend ... Ich würde wirklich gerne mehr Details erfahren und ich habe etwas Angst, jetzt ebay zu nutzen. für andere Leute: Klicken Sie auf die 4. Frage, um zu sehen, was er über ihre Datenbankstruktur sagt. Das ganze Interview ist jedoch sehenswert. auch ...unibrow
gloomy.penguin
6

Ich denke, irgendwann muss eine einzige Sache für die Sicherstellung gültiger Beziehungen verantwortlich sein.

Beispielsweise verwendet Ruby on Rails keine Fremdschlüssel, überprüft jedoch alle Beziehungen selbst. Wenn Sie immer nur von dieser Ruby on Rails-Anwendung auf Ihre Datenbank zugreifen, ist dies in Ordnung.

Wenn Sie jedoch andere Clients haben, die in die Datenbank schreiben, müssen diese ohne Fremdschlüssel ihre eigene Validierung implementieren. Sie haben dann zwei Kopien des Validierungscodes, die höchstwahrscheinlich unterschiedlich sind und die jeder Programmierer als Hauptsünde erkennen sollte.

Zu diesem Zeitpunkt sind Fremdschlüssel wirklich erforderlich, da Sie damit die Verantwortung wieder auf einen einzelnen Punkt verlagern können.

Orion Edwards
quelle
2
Es ist wie eine Zwiebel. FKs sind die letzte Verteidigungsschicht. Sofern es sich nicht um eine eingebettete lokale Datenbank handelt, sind Apps, die versuchen, referenzielle Integrität zu erreichen, immer eine schlechte Idee.
Fabricio Araujo
5

Mit Fremdschlüsseln kann jemand, der Ihre Datenbank noch nicht gesehen hat, die Beziehung zwischen Tabellen bestimmen.

Jetzt mag alles in Ordnung sein, aber denken Sie daran, was passieren wird, wenn Ihr Programmierer geht und jemand anderes übernehmen muss.

Mit Fremdschlüsseln können sie die Datenbankstruktur verstehen, ohne Tausende von Codezeilen durchsuchen zu müssen.

Craig
quelle
5

Soweit ich weiß, werden Fremdschlüssel verwendet, um dem Programmierer zu helfen, Daten auf die richtige Weise zu bearbeiten.

Mit FKs kann der DBA die Datenintegrität vor dem Fummeln von Benutzern schützen, wenn der Programmierer dies nicht tut, und manchmal vor dem Fummeln von Programmierern schützen.

Angenommen, ein Programmierer tut dies tatsächlich bereits auf die richtige Weise. Brauchen wir dann wirklich das Konzept der Fremdschlüssel?

Programmierer sind sterblich und fehlbar. FKs sind deklarativ , was es schwieriger macht, sie zu vermasseln .

Gibt es andere Verwendungszwecke für Fremdschlüssel? Vermisse ich hier etwas?

Obwohl dies nicht der Grund ist, warum sie erstellt wurden, bieten FKs starke zuverlässige Hinweise auf Diagrammwerkzeuge und Abfrage-Builder. Dies wird an Endbenutzer weitergegeben, die dringend zuverlässige Hinweise benötigen.

Peter Wone
quelle
Dies ist eine großartige Antwort.
Dan Lugg
4

Sie sind nicht unbedingt erforderlich, da Sicherheitsgurte nicht unbedingt erforderlich sind. Aber sie können dich wirklich davor bewahren, etwas Dummes zu tun, das deine Datenbank durcheinander bringt.

Es ist so viel schöner, einen FK-Einschränkungsfehler zu debuggen, als einen Löschvorgang zu rekonstruieren, der Ihre Anwendung beschädigt hat.

Mark Harrison
quelle
4

Sie sind wichtig, da Ihre Anwendung nicht die einzige Möglichkeit ist, Daten in der Datenbank zu bearbeiten. Ihre Anwendung kann die referenzielle Integrität so ehrlich behandeln, wie sie möchte, aber es ist nur ein Bozo mit den richtigen Berechtigungen erforderlich, um einen Befehl zum Einfügen, Löschen oder Aktualisieren auf Datenbankebene auszugeben, und die Durchsetzung der referenziellen Integrität Ihrer Anwendung wird umgangen. Das Einfügen von FK-Einschränkungen auf Datenbankebene bedeutet, dass die FK-Einschränkung, sofern dieser Bozo die FK-Einschränkung nicht deaktiviert, bevor der Befehl ausgegeben wird, dazu führt, dass eine fehlerhafte Anweisung zum Einfügen / Aktualisieren / Löschen mit einer Verletzung der referenziellen Integrität fehlschlägt.

Mike McAllister
quelle
3

Ich denke darüber in Bezug auf Kosten / Nutzen nach ... In MySQL ist das Hinzufügen einer Einschränkung eine einzelne zusätzliche Zeile von DDL . Es sind nur eine Handvoll Schlüsselwörter und ein paar Sekunden Nachdenken. Das sind meiner Meinung nach die einzigen "Kosten" ...

Werkzeuge lieben Fremdschlüssel. Fremdschlüssel verhindern fehlerhafte Daten (dh verwaiste Zeilen), die die Geschäftslogik oder -funktionalität möglicherweise nicht beeinträchtigen und daher unbemerkt bleiben und sich aufbauen. Außerdem wird verhindert, dass Entwickler, die mit dem Schema nicht vertraut sind, ganze Arbeitsblöcke implementieren, ohne zu bemerken, dass ihnen eine Beziehung fehlt. Vielleicht ist im Rahmen Ihrer aktuellen Anwendung alles großartig, aber wenn Sie etwas verpasst haben und eines Tages etwas Unerwartetes hinzugefügt wird (denken Sie an ausgefallene Berichte), befinden Sie sich möglicherweise an einem Ort, an dem Sie fehlerhafte Daten, die sich seit dem Start angesammelt haben, manuell bereinigen müssen des Schemas ohne Datenbank erzwungene Prüfung.

Die geringe Zeit, die benötigt wird, um zu kodifizieren, was sich beim Zusammenstellen bereits in Ihrem Kopf befindet, könnte Ihnen oder jemand anderem ein paar Monate oder Jahre später Trauer ersparen.

Die Frage:

Gibt es andere Verwendungszwecke für Fremdschlüssel? Vermisse ich hier etwas?

Es ist ein bisschen geladen. Fügen Sie anstelle von "Fremdschlüsseln" Kommentare, Einrückungen oder Variablennamen ein ... Wenn Sie die betreffende Sache bereits perfekt verstehen, ist dies für Sie "nutzlos".

danb
quelle
2

Entropiereduktion. Reduzieren Sie das Potenzial für chaotische Szenarien in der Datenbank. Wir haben es schwer, da alle Möglichkeiten in Betracht gezogen werden. Meiner Meinung nach ist die Reduzierung der Entropie der Schlüssel zur Wartung eines Systems.

Wenn wir zum Beispiel eine Annahme machen: Jede Bestellung hat einen Kunden, dass die Annahme durch etwas erzwungen werden sollte . In Datenbanken ist "etwas" ein Fremdschlüssel.

Ich denke, das ist den Kompromiss bei der Entwicklungsgeschwindigkeit wert. Sicher, Sie können schneller mit ihnen codieren, und dies ist wahrscheinlich der Grund, warum manche Leute sie nicht verwenden. Persönlich habe ich einige Stunden mit NHibernate und einigen Fremdschlüsseleinschränkungen getötet, die wütend werden, wenn ich eine Operation durchführe. Ich weiß jedoch, was das Problem ist, also ist es weniger ein Problem. Ich benutze normale Tools und es gibt Ressourcen, die mir helfen, das zu umgehen, möglicherweise sogar Leute, die mir helfen!

Die Alternative besteht darin, zuzulassen, dass sich ein Fehler in das System einschleicht (und dies bei ausreichender Zeit), wenn kein Fremdschlüssel festgelegt ist und Ihre Daten inkonsistent werden. Dann erhalten Sie einen ungewöhnlichen Fehlerbericht, untersuchen und "OH". Die Datenbank ist verschraubt. Wie lange wird es dauern, bis das Problem behoben ist?

Streit
quelle
1

Sie können Fremdschlüssel als Einschränkung anzeigen, die,

  • Helfen Sie dabei, die Datenintegrität aufrechtzuerhalten
  • Zeigen Sie, wie Daten miteinander in Beziehung stehen (was bei der Durchsetzung von Geschäftslogik und -regeln hilfreich sein kann).
  • Bei korrekter Verwendung kann dies dazu beitragen, die Effizienz zu steigern, mit der die Daten aus den Tabellen abgerufen werden.
Pascal
quelle
1

Wir verwenden derzeit keine Fremdschlüssel. Und zum größten Teil bereuen wir es nicht.

Das heißt - wir werden sie wahrscheinlich in naher Zukunft aus mehreren Gründen viel häufiger einsetzen, beide aus ähnlichen Gründen:

  1. Diagramme. Es ist so viel einfacher, ein Diagramm einer Datenbank zu erstellen, wenn Fremdschlüsselbeziehungen korrekt verwendet werden.

  2. Werkzeugunterstützung. Es ist viel einfacher, Datenmodelle mit Visual Studio 2008 zu erstellen, die für LINQ to SQL verwendet werden können, wenn geeignete Fremdschlüsselbeziehungen bestehen.

Mein Punkt ist also, dass wir festgestellt haben, dass Fremdschlüssel nicht unbedingt erforderlich sind, wenn wir viel manuelle SQL-Arbeit (Konstruktionsabfrage, Abfrage ausführen, blahblahblah) ausführen. Sobald Sie jedoch mit der Verwendung von Tools beginnen, werden diese viel nützlicher.

John Christensen
quelle
1
Ich arbeite an Systemen, die sie nicht verwenden. Und ich bereue es regelmäßig. Ich habe mehr Fälle gesehen, in denen ich unsinnige Daten zählen kann, die durch geeignete Einschränkungen verhindert worden wären.
rekursiv
Und da ich seit fast sechs Monaten mit Fremdschlüsseln an unserem aktuellen Projekt arbeite, stimme ich diesem Kommentar voll und ganz zu.
John Christensen
1

Das Beste an Fremdschlüsseleinschränkungen (und Einschränkungen im Allgemeinen) ist, dass Sie sich beim Schreiben Ihrer Abfragen auf sie verlassen können. Viele Abfragen können viel komplizierter werden, wenn Sie sich nicht darauf verlassen können, dass das Datenmodell "true" enthält.

Im Code wird im Allgemeinen nur irgendwo eine Ausnahme ausgelöst - in SQL erhalten wir im Allgemeinen nur die "falschen" Antworten.

Theoretisch könnte SQL Server Einschränkungen als Teil eines Abfrageplans verwenden - aber abgesehen von Überprüfungsbeschränkungen für die Partitionierung kann ich nicht sagen, dass ich das jemals tatsächlich gesehen habe.

Mark Brackett
quelle
Eindeutigkeitsbeschränkungen weisen auf eine hohe Kardinalität hin, die vom Optimierer bei der Auswahl eines Verbindungsmechanismus verwendet wird.
Peter Wone
1

Fremdschlüssel waren in Projekten (Geschäftsanwendungen und Websites für soziale Netzwerke), an denen ich gearbeitet habe, nie explizit angegeben worden (Tabelle FOREIGN KEY REFERENCES (Spalte)).

Aber es gab immer eine Art Konvention, Spalten zu benennen, die Fremdschlüssel waren.

Es ist wie bei der Datenbanknormalisierung - Sie müssen wissen, was Sie tun und was die Folge davon ist (hauptsächlich Leistung).

Ich bin mir der Vorteile von Fremdschlüsseln bewusst (Datenintegrität, Index für Fremdschlüsselspalten, Tools, die das Datenbankschema kennen), aber ich habe auch Angst, Fremdschlüssel als allgemeine Regel zu verwenden.

Außerdem können verschiedene Datenbankmodule Fremdschlüssel auf unterschiedliche Weise bereitstellen, was zu subtilen Fehlern während der Migration führen kann.

Das Entfernen aller Bestellungen und Rechnungen eines gelöschten Kunden mit ON DELETE CASCADE ist das perfekte Beispiel für ein gut aussehendes, aber falsch gestaltetes Datenbankschema.

Grzegorz Gierlik
quelle
0

Ja. Das ON DELETE [RESTRICT | CASCADE] verhindert, dass Entwickler Daten stranden, und hält die Daten sauber. Ich bin kürzlich einem Team von Rails-Entwicklern beigetreten, die sich nicht auf Datenbankeinschränkungen wie Fremdschlüssel konzentriert haben.

Zum Glück habe ich diese gefunden: http://www.redhillonrails.org/foreign_key_associations.html - RedHill on Ruby on Rails-Plug-Ins generieren Fremdschlüssel mithilfe der Konvention über den Konfigurationsstil . Eine Migration mit product_id einen Fremdschlüssel für die erstellen - ID in der Produkte - Tabelle.

Schauen Sie sich die anderen großartigen Plug-Ins bei RedHill an , einschließlich Migrationen, die in Transaktionen eingeschlossen sind.

Peter Mortensen
quelle
0

Wenn Sie vorhaben, Ihren Datenzugriffscode, dh Entity Framework oder ein anderes ORM, zu generieren, verlieren Sie die Möglichkeit, ein hierarchisches Modell ohne Fremdschlüssel zu generieren

Mike Griffin
quelle