Frage

Ich weiß, diese Frage auf der „grüne“ Seite ein wenig erscheinen, aber nach der Anzahl der „Unternehmen“ oder „kommerziellen“ Datenbanken ich erlebt habe ich habe diese Frage begonnen zu fragen. Welche Vorteile bieten Einschränkungen in einer Datenbank? Ich bin mehr über Foreign Key Constraints zu fragen, anstatt Einzigartige Einschränkungen. Haben sie bieten Performance-Gewinne, oder einfach nur die Datenintegrität?

Ich war ohne Fremdschlüssel bei der Anzahl von relationalen Datenbanken eher überrascht oder sogar ohne Primärschlüssel angegeben (nur Einschränkungen für Felder sind nicht null oder eine eindeutige Einschränkung auf dem Feld).

Die Gedanken?

War es hilfreich?

Lösung

"nur" Datenintegrität? Sie sagen, dass, wie es eine Kleinigkeit ist. Bei allen Anwendungen ist es von entscheidender Bedeutung. Also ja, es sieht vor, dass, und es ist ein großer Vorteil.

Andere Tipps

Die Integrität der Daten ist, was sie anbieten. Wenn alles, was sie haben auf Kosten der Leistung (eine sehr geringfügige zumindest).

Sie bieten sowohl Leistung als auch die Datenintegrität, und letztere ist von größter Bedeutung für jedes ernsthaftes System. Ich erschaudern jedes Mal, wenn ich eine Datenbank ohne Fremdschlüssel sehen und wo alle Integrität wird durch Trigger geschehen (wenn überhaupt). Und ich sah ziemlich viel von denen da draußen.

Die folgende, vorausgesetzt, Sie die Einschränkung richtig in erster Linie erhalten: -

  • Ihre Daten werden in Bezug auf die Einschränkung gültig
  • Die Datenbank kennt Ihre Daten in Bezug auf die Einschränkung gültig und kann diese verwenden, wenn die Abfrage oder die Aktualisierung der Datenbank
  • (zum Beispiel eine unnötige beitreten für eine Abfrage auf einen Blick zu entfernen)
  • Die Einschränkung ist für zukünftige Nutzer der Datenbank
  • dokumentiert
  • Eine Verletzung der Einschränkung wird so bald wie möglich gefangen; in einem späteren Prozess in keinem Zusammenhang nicht, dass nicht

In relationaler Theorie, eine Datenbank, die inkonsistenten Daten erlaubt ist nicht wirklich eine relationale Datenbank. Fremdschlüssel sind erforderlich, um die Datenintegrität und Konsistenz der Datenbank „relational“ zu halten; das heißt das logische Modell der Datenbank ist immer korrekt.

In der Praxis ist es in der Regel einfacher, einen Fremdschlüssel zu definieren, und lassen Sie den DB-Engine Griff sicherstellen, dass die Beziehung gültig ist. Die anderen Optionen sind:

  • nichts - garantierte Datenkorruption an einem gewissen Punkt
  • DB löst - die wird in der Regel langsamer und weniger performant
  • Anwendungscode - die wird schließlich zu Problemen führen, wenn entweder Sie vergessen, das Recht rufen Zugriffe Code oder eine andere Anwendung die Datenbank.

Die Daten sind von Vorteil. Viele Lehrbücher sagen, dass.

Aber es ist eigentlich falsch. Es sollte eher sagen „richtige Daten sind ein Vermögenswert, falsche Daten sind eine Haftung“.

Und Datenbank Einschränkungen geben Ihnen die bestmögliche Garantie dafür, dass Daten korrekt sind.

In einigen DBMS (zum Beispiel Oracle) Einschränkungen kann tatsächlich verbessern die Leistung einiger Abfragen, da der Optimierer die Einschränkungen nutzen kann Wissen über die Struktur der Daten zu gewinnen. siehe Einige Beispiele diesen Oracle Magazine Artikel .

Ich würde sagen, alle erforderlichen Einschränkungen in der Datenbank sein. Fremdschlüssel-Constraints verhindern unbrauchbar Daten. Sie sind kein schön zu haben - sie sind eine Voraussetzung, wenn Sie eine nutzlose Datenbank wollen. Fremdschlüssel kann die Leistung von Löschungen und Aktualisierungen verletzt, aber das ist OK. Ist es besser, ein wenig länger dauern, ein Lösch zu tun (oder der Anwendung zu sagen, diese Person nicht zu löschen, weil er Aufträge im System hat) oder den Benutzer zu löschen, aber nicht seine Daten? Der Mangel an Fremdschlüsseln verursacht unerwartete und oft schwerwiegende Probleme in die Daten abfragt. Zum Beispiel all Kostenberichte abhängen können auf den Tischen bezogenen Daten mit und können so nicht, wichtige Daten zeigen, weil eine oder mehr Tabellen nichts zu verbinden haben.

Eindeutige Integritätsbedingungen sind auch eine Voraussetzung für jeden anständigen databse. Wenn ein Feld oder eine Gruppe von Feldern eindeutig sein müssen, scheitern diese in der Datenbank leve zu definieren ist tocreate Datenprobleme, die extrem schwer zu beheben sind.

Sie nicht erwähnen, andere Einschränkungen, aber Sie sollten. Jede Geschäftsregel, die muss immer auf alle Daten in der Tabelle angewandt werden, sollte immer in der Datenbank durch einen Datentyp angewandt werden (wie ein Datatime-Datentyp, die '02 \ 31 \ 2009' als gültiges Datum akzeptiert willnot), eine Einschränkung (zB eine, die nicht das Feld einen Wert größer als 100) oder durch einen Auslöser zu haben, nicht erlaubt ist die Logik so komplex ist es nicht von einem gewöhnlichen constraint gehandhabt werden kann. (Trigger sind schwierig zu schreiben, wenn Sie nicht wissen, was Sie tun, wenn Sie also Logik diesen Komplex haben Sie hoffentlich adatabase in Ihrem Team professionell haben.) Die Bestellung zu wichtig ist. Datentypen sind die erste Wahl, von Zwängen, gefolgt von Trigger als letzter Wahl gefolgt.

Einfachere Anwendungscode

Eine nette Sache, die sie bieten, ist, dass Anwendungscode viel weniger Fehlerprüfung und Validierung zu tun hat. Vergleichen Sie diese beiden Teile des Codes und vermehren sich durch Tausende von Operationen und man kann sehen, dass es ein großer Gewinn.

get department number for employee  # it's good coz of constraints
do something with department number

vs.

get department number for employee
if department number is empty
    ...
else if department number not in list of good department numbers
    ....
else
    do something with department number

Natürlich, die Menschen, die Zwänge wahrscheinlich ignorieren nicht viel Mühe in die Code-Validierung setzen sowieso ...: - /

Oh, und wenn die Datenlage zu ändern, es ist ein Datenbank-Konfigurationsproblem und keine Codeänderung Problem.

Integritätsbedingungen sind besonders wichtig, wenn Sie mehrere Anwendungen mit einer gemeinsamen Datenbank zu integrieren.

Unter Umständen können Sie richtig Datenintegrität in einer einzigen Anwendung des Code verwalten (und selbst wenn Sie dies nicht tun, zumindest die gebrochenen Daten nur, dass die Anwendung betreffen), aber mit mehreren Anwendungen werden es haarig (und am wenigsten redundante ).

„Oh, und wenn die Datenlage zu ändern, es ist ein Datenbank-Konfigurationsproblem und keine Codeänderung Problem.“

Es sei denn, es eine Einschränkung ist, die von der Konstruktion verschwindet. In diesem Fall ist es auf jeden Fall einen Code Auswirkungen, weil einige Code geschrieben worden sein könnte, die auf dieser entfernt Einschränkung hängt dort zu sein.

Das muss immer in Betracht gezogen werden, wenn „laxing“ oder „Entfernen“ jede Einschränkung erklärt.

Other than that, Sie sind natürlich völlig recht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top