2009-03-01 19 views
18

Mögliche Duplizieren:
What’s wrong with foreign keys?Sollte ich Fremdschlüssel verwenden?

Ich benutze MS SQL Server mit einer großen Datenbank über 4 GB Daten.

Ich suche im Internet, warum ich Fremdschlüssel verwenden sollte. Ich habe nur die Schlüssel indiziert, die zum Verknüpfen von Tabellen verwendet werden. Leistung ist alles in Ordnung, Datenintegrität ist kein Problem.

Sollte ich Fremdschlüssel verwenden? Werde ich mit Fremdschlüsseln noch mehr Leistung erzielen?

Antwort

5

Ein Fremdschlüssel ist in erster Linie ein Werkzeug zum Erzwingen der Datenbankintegrität, die nichts mit der Ausführungsgeschwindigkeit zu tun hat.

Wenn Sie Ihr Indexdesign bereits optimiert haben, sind diese Indizes wahrscheinlich bereits installiert, zumindest als nicht eindeutige Indizes. So würde ich keine Leistungsänderung nur von der Installation von Fremdschlüsseln erwarten (die nicht notwendigerweise einen Index einschließen.)

Ich würde ein wenig Misstrauen über Ihre Selbstzufriedenheit über die Optimierung Ihres Entwurfs sein, obwohl, wenn Sie haben dieses Konzept nicht schon genagelt.

Lesen Sie die Dokumentation für Foreign Keys mit dem Ziel zu verstehen, was sie tun, um Integrität zu erzwingen (es ist in jedem Fall wissenswert.) Dann sehen, ob das Ihre Frage nicht vollständig beantwortet.

+1

„in keinem Zusammenhang mit Geschwindigkeit der Ausführung“ deaktivieren für Einsätze nicht ganz korrekt ist (ich weiß, Sie wissen aber Tuan vielleicht nicht) – SquareCog

+0

Thx - ich ein bisschen die Antwort ausgefüllt, auf eine Weise, die am selben Ort enden sollte. – dkretz

+0

gute argument über einfügen. Ich habe eine gute Sicht auf die Struktur. wie ich sagte integrität ist kein problem. Ich brauche rohe Geschwindigkeit. –

13

Fremdschlüssel verbessern die Leistung nicht, sie verursachen nur einen kleinen Leistungsabfall bei allen Schreibvorgängen, um sicherzustellen, dass die Einschränkung eingehalten wird.

Der Grund, warum Sie diese verwenden möchten, ist, um destruktive Schreibvorgänge zu verhindern. Wenn Sie sie nicht haben, kann fehlerhafter Code oder eine ungültige SQL-Anweisung Zeilen entfernen, die erwartet werden.

1

Fremdschlüssel machen Datenintegrität besser, Leistung, etwas langsamer beim Löschen/Einfügen/Aktualisieren.
In meiner letzten Firma haben wir beschlossen, Integrität/Verbindungen in der BL zu halten, da es Änderungen in der BL einfacher macht (denke Hunderte von Millionen von Datensätzen). Wenn Sie eine kleine App haben, sehe ich keinen Grund, warum es nicht in der Datenschicht (db)

+0

Wofür steht BL? – usefulBee

+1

Business-Schicht, Datenschicht behandelt den Code, der direkt mit der Datenbank spricht. BL übernimmt diese Daten und implementiert die Geschäftsregeln unter Verwendung dieser Daten und sendet sie an die Benutzeroberfläche. Es ist eine etwas alte Art, eine mehrstufige Software zu betrachten. Heute haben wir mehr als drei Schichten/Ebenen und wir haben ein weit verbreitetes System, um dies hinzuzufügen. –

+0

Mit den Worten: "Wir haben beschlossen, die Integrität/Verbindungen in der BL zu halten", beziehen Sie sich auf Code First Ansatz oder was sonst? – usefulBee

4

Was in der älteren Frage nicht erwähnt wurde, dass SquareCog mit früheren verknüpft - ja, Fremdschlüssel Einschränkungen können ein Schmerz sein, wenn Durchführen von Datenbereinigungen, Stapelaktualisierungen, Testdatengenerierung oder jeder Art von Operation, bei der Sie die normale Abfolge von Dingen umgehen. Aber - Sie können Ihre Fremdschlüssel-Constraints immer löschen, bevor Sie etwas tun, und sie später erneut erstellen (wenn Sie Ihre Datenbankobjekte ordnungsgemäß scripten, ist dies kaum zusätzliche Arbeit).

Ich war mal faul, bin aber auf Fremdschlüsselabhängigkeiten angewiesen. Es gibt immer noch Situationen, in denen Sie sie nicht haben können - wie in datenbankübergreifenden Beziehungen.

3

Es gibt ein Feature/Einschränkung, die Fremdschlüssel Ihrem System bringen, was bisher nicht erwähnt wurde. Das ist Commit/Transaktionslogik (so nenne ich es sowieso). Wenn Fremdschlüssel aktiviert sind, müssen alle Zeilen für ein Update in allen betroffenen Tabellen vorhanden sein, damit das Commit ausgeführt werden kann (keinen SQL-Fehler auslösen, bei dem die Fremdschlüsseleinschränkungen verletzt wurden).

Wenn Sie eine Reihe von Code haben, der funktioniert und "spielt schnell und locker", mit Commits/Transaktionen. Dann könntest du ein wenig Abhilfe schaffen, damit die Dinge mit FKs im Schema funktionieren.

Auch, zumindest Oracle, können Sie Einschränkungen deaktivieren (nicht nur löschen/entfernen). So können Sie sie einfach ein-/ausschalten. Praktisch, wenn Sie einige Bulk-Operationen entweder ohne den Overhead der Constraints durchführen wollen, oder um etwas "Operation" an den Daten durchzuführen, die Zwischenzustände haben, die die Constraints nicht erfüllen würden.

+0

Beide sind in dem Link erwähnt, den ich gepostet habe, aber Ich werde trotzdem für dich stimmen. Die "Festschreibungs/Transaktionslogik" wird offiziell als ACID-Garantien bezeichnet (wobei das "C" für konsistent ist, da, nachdem eine Transaktion beendet ist, die Daten konsistent mit deklarierten Beschränkungen sind). – SquareCog

1

Fremdschlüssel helfen auch dabei, Ihre Datenbank sauber zu halten, da die Datenbank einen Kaskadierungsabfall verursachen kann.

9

Integrität ist heute vielleicht kein Problem, aber genau diese Einstellung macht es morgen oder in zwei Wochen zum Problem.

4

In MySQL können Sie Foreign Key mit SET FOREIGN_KEY_CHECKS=0

Verwandte Themen