Frage

Vor einiger Zeit ich eine Diskussion mit meinen Kollegen über die Persistenz von Domain Models hatte und ob wir sollten auf Datenbankebene Fremdschlüssel-Constraints erzwingen.

Meine erste Reaktion war, dass die sehr Verwendung einer relationalen Datenbank, um die Durchsetzung dieser Beschränkungen impliziert, aber einige argumentiert, dass die Datenbank als nichts anderes als ein Persistenzmechanismus gesehen werden sollte, und deshalb sollten wir vermeiden es jede Geschäftslogik setzt. Am Ende haben wir durch keine Fremdschlüssel-Constraints verwendet wird.

Hier ist meine Frage (ich hoffe, dass es nicht zu allgemein ist): ist es gute Praxis betrachten Schlüsseleinschränkungen in diesen Fällen zu erzwingen

?
War es hilfreich?

Lösung

Erzwingen Zwänge, aber auf sie nicht verlassen, in der Business-Logik

  • Nein Unternehmen Logik auf der Datenbank: Ich mit dem Grundsatz einverstanden. Und wenn Ihr Nicht-SQL Business-Code setzt auf die Datenbank Zwänge Ihrer Datenbank Konsistenz zu prüfen, dann sollten Sie Ihre Geschäftslogik zu überdenken.
  • Es ist nichts falsch mit der Datenbank Einschränkungen zusätzlich , um Ihre Business-Logik. Vor allem, weil Dinge wie referentielle Integrität mit Fremdschlüsseln und andere Einschränkungen sind einfach zu tun und RDBMS tun, dass die Arbeit für Sie sehr effizient ohne viel Wartung.
  • Werden Sie nicht verwenden Indizes auf die Datenbank zu, weil es nicht ist rein persistency zu tun?
  • Suchen und Beheben von Software-Fehler können nehmen Sie sich etwas Zeit, aber Sie auf jeden Fall will nicht noch mehr Zeit verbringen Reinigung oder (noch schlimmer) einige Daten zu verlieren, nur weil Sie sich selbst eine Mühe gerettet einzeilige Skript für ein FK zu schreiben. Wirklich: Ihr get etwas kostenlos hier und Ihre ablehnen
  • ?
  • [EDIT-1]: können Sie garantieren, dass die Daten in der Datenbank verwaltet werden würden NUR über Ihre Anwendung? Es scheint immer Ausnahmen, vor allem von Power-Usern, die sich manchmal tun (sehr selten :-) Fehler machen und einige SQL-Anweisungen ausführen Code, Update-Status zu bereinigen (ungültiger Werte wegen Tippfehler) etc.
  • [EDIT-2]: Gebäude Domain angetrieben Modell ist keine Entschuldigung kein gutes DB Admin zu mieten. ORM ist eine Entschuldigung nicht nicht gut DB-Entwickler zu mieten.

Aber wenn Sie und Ihr Team sind in der Lage zu schreiben bug-freier Software und behandelt alle mögliche Ausnahme Szenarien in Ihrem Code (einschließlich Hardware / Netzwerk / Dummy-Benutzer / Programmierer-Fehler Ausfälle), dann "Hei, warum die Mühe mit überflüssig FK Einschränkungen ...." - -teaser -

Andere Tipps

ich so denke, ich halte es nicht so viel, etwas für Business-Logik, sondern „schlechte“ Daten werden in die Datenbank eingegeben zu verhindern. Sobald die Datenbank sehr groß wird werden diese Einschränkungen Kopfschmerzen in der Zukunft verhindern.

Dies wird besonders in Kraft treten, wenn Sie mehrere Entwickler Entwicklung von Anwendungen für die gleichen Daten haben. Dies wird sicherstellen, dass sie auch nur gültige Daten eingeben. Einschränkungen gesteuert in 1 Stelle statt in x-Anwendungen zu haben, ist sicherlich von Vorteil.

Ich fühle mich wirklich nützliche Tools wie zu ignorieren (auf Datenbankebene Datenintegrität) zum Zweck einer reinen Entwicklungsmethodik ist kontraproduktiv. Datenbanken sind bei dieser Art der Sache wirklich gut ... lassen sie es tun.

An einem gewissen Punkt jede Methodik beginnt zu brechen und Sie müssen nur praktisch sein.

Früher habe ich so denken, aber meine Meinung geändert hat, seit ich viel schreiben ressourcenorientierte Systeme gestartet. Typischerweise sind weit mehr als nur für Fremdschlüssel benötigt, um ein Stück von Daten bestätigen - zB eines Ticket, das im Status „zugeordnet“ muss eine gültige „assigned_to“ Wert ist, und so weiter. Alle diese Regeln sollte in einer Validierungsroutine von einer Art gestellt werden, und zwar theoretisch könnte es nicht weh auf Datenbankebene zusätzliche Validierung haben, wenn Sie Ihre App-Level-Validierung funktioniert, die ausländische Kontrolle Schlüsseleinschränkung wird Zyklen nur verschwendet. Viel schlimmer aber, haben Sie jetzt Logik über Ihr Datenmodell in zwei Orten wiederholt bekommen - der Validierungscode und die Datenbankbeschränkungen.

Denken Sie auf diese Weise darüber: Würden Sie in andere Anwendungslogik verschieben möchten in die Datenbank (zB über gespeicherte Prozeduren), wenn Sie nicht haben? Wenn Sie nicht gezwungen waren, so von Leistungsüberlegungen zu tun, ich denke, die Antwort im Allgemeinen sein sollte „nein“.

"Meine erste Reaktion war, dass die sehr Verwendung einer relationalen Datenbank, um die Durchsetzung dieser Beschränkungen impliziert, aber einige argumentiert, dass die Datenbank sollte aber ein Persistenzmechanismus wie nichts zu sehen und deshalb sollten wir in ihm jede Geschäftslogik vermeiden platzieren. Am Ende haben wir durch keine Fremdschlüssel-Constraints verwenden. "

Ja, na ja, die mittelmäßige Mehrheit gewinnt immer diese Art von Debatte durch die bloße Kraft von Zahlen, leider.

Wenn Sie immer noch diesen Kampf kämpfen, könnten Sie Ihre Gegner fragen, wie sie jedermann zu halten beabsichtigen verwenden „direkte Datenbank-Editoren“ (ala db2-Hilfe, SPUFI, ...) und wie sie beabsichtigen, jemand zu verhindern, korrumpieren die Datenbank mit solchen Werkzeugen (die ihre programmierten geschäftlichen Einschränkungen durch Definition umgehen).

Wenn Sie die Domain Driven Design-Paradigma folgen wollen, dann wäre die Antwort ja für alles innerhalb eines Aggregats, und keine für alle Quer Aggregate Links.

In fast allen Fällen möchten Sie alles unter der Aggregate Wurzel gelöscht werden, wenn die Wurzel selbst gelöscht wird, und mit so Fremdschlüssel, die diese repräsentieren, mit Cascading löscht, können Sie diese Ebene in der Datenbank erreichen. Sie können auch Ihre Repositorys haben tun die kaskadierende Löschungen selbst wenn Sie es nicht in einem DB-Ebene zu tun haben wollen, aber der Punkt steht immer noch, dass Aggregate Kinder nicht ohne Root existieren sollten.

Für Cross-Aggregate betrifft, werden Sie wahrscheinlich mit Geschäftsentscheidungen zu tun haben, was passieren soll, wenn der eine oder andere wird entfernt. Oft möchten Sie mit diesem asynchron zu tun für die Skalierbarkeit zu ermöglichen, und so Ihre Domain-Modell landet schließlich im Einklang zu sein. Daher macht es keinen Sinn, in diesen Fällen Fremdschlüssel zu erzwingen, da es werde ein Zeitfenster, in denen der eine oder der andere Schlüssel nicht vorhanden.

Ich hoffe, das hilft! Für weitere Informationen, überprüfen Sie auf jeden Fall aus Evans' Buch über die Domain Driven Design -. und die viele Links rund um das Web zu

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