Erzwingen der Datenbankintegrität

19

Wäre es jemals sinnvoll, wenn die Anwendung die Datenbankintegrität erzwingt, anstatt über Fremdschlüssel zu verfügen, Einschränkungen zu überprüfen usw.?

Inwieweit ist eine Leistungsverbesserung zu erwarten, wenn die Datenbankintegrität nicht durch interne Datenbanktools erzwungen wird?

Renats Stozkovs
quelle

Antworten:

24

Um ehrlich zu sein, werden Sie nicht nur kaum Leistungseinbußen durch Fremdschlüsseleinschränkungen in der Datenbank feststellen, sondern auch Leistungsverbesserungen feststellen. Das SQL Server-Abfrageoptimierungsprogramm basiert auf dem Konzept von Primär- und Fremdschlüsseln sowie anderen Arten von Dateneinschränkungen. Wenn diese vorhanden und erzwungen sind, kann das Optimierungsprogramm sie nutzen, um eine bessere Leistung zu erzielen. Hier ist ein Blog-Beitrag mit einem einfachen Beispiel , das es in Aktion zeigt.

Wenn Sie sich in einem Randfall befinden, in dem tatsächlich mehr Einfügungen als Lesevorgänge vorliegen (und Aktualisierungen und Löschvorgänge Lesevorgänge erfordern, sodass sie normalerweise zur Lesezahl hinzugefügt werden), ist es möglicherweise sinnvoll, Einschränkungen für die Leistung aus den Daten zu entfernen . Da die überwiegende Mehrheit der Datenbanken jedoch lesebezogen ist, wird die Leistung nicht verbessert, sondern geopfert.

In keinem Fall wird erwähnt, dass die Datenintegrität in der Datenbank besser gehandhabt wird, da Sie sie nur einmal erstellen müssen, wenn Sie die gesamte Arbeit im Code erledigen, und dies möglicherweise mehrmals für mehrere Apps tun müssen (es sei denn, Sie entwerfen Ihre Datenzugriffsebene sorgfältig und erfordern, dass jede App auf die Datenbank zugreift, um dieselbe Ebene zu durchlaufen).

Wenn Sie ein relationales Datenbanksystem verwenden, sage ich, warum sollten Sie es nicht wirklich verwenden? Wenn Sie keine relationalen Daten benötigen, entscheiden Sie sich für Hadoop oder etwas anderes.

Grant Fritchey
quelle
2
Das entspricht ziemlich genau dem, was ich selbst gedacht und erwartet habe. Ich wusste, dass der DBA bei meinem vorherigen Job falsch lag, wollte nur eine unabhängige Meinung dazu einholen. Vielen Dank!
Renats Stozkovs
17

Viele Anwendungsentwickler denken das auch.

Wenn Sie versucht sind, die Datenintegrität an den Anwendungscode zu delegieren, denken Sie: "Jeder Programmierer und jede Anwendung, die von jetzt an bis zum Ende der Zeit auf diese Datenbank zugreift, muss es jedes Mal perfekt machen."

Was sind die Chancen?

Mike Sherrill 'Cat Recall'
quelle
5
+1. Das ist es im Grunde. Sie ersetzen ein gut getestetes und zentrales System durch eine Anforderung, an die sich viele Programmierer halten müssen. Jedes Mal. Wird nicht passieren, so dass Sie im Laufe der Zeit Datenbanken mit schlechten Daten erhalten.
TomTom,
13

Selbst wenn es einen Leistungsgewinn gibt, ist dieser im Vergleich zur Wiederherstellung der referenziellen Integrität und der allgemeinen Datenintegrität vernachlässigbar.

Vorbei sind die Zeiten, in denen eine Datenbank ein dummer Datenspeicher ist. Nutzen Sie die Leistung, die RDBMS bietet.

Leistungszuwächse sind nicht alles, besonders in einem so kleinen Maßstab. Wenn Sie jedoch feststellen, dass Ihre Anwendung eine vermeintliche Fremdschlüsselbeziehung erzwingen soll und dies kein Primärschlüssel in der Referenzierungstabelle ist, interessiert Sie der Leistungsgewinn nur wenig (sofern vorhanden) Ich spreche nicht über die Einzelheiten davon.

Thomas Stringer
quelle
-1. Vorbei sind die Zeiten, in denen Benutzer eine Anwendungslogik in die Datenbank aufgenommen haben, die am schwierigsten und teuersten ist, einen Teil des gesamten Stacks zu skalieren - für mich sind Datenbanken ein Speicherauszug mit von Anwendungen ausgeführter Logik. DAS GESAGT: Referentielle Integrität bezieht sich auf die Integrität auf Datenbankebene und ist sehr nützlich.
TomTom,
5
@TomTom Beim Umschreiben der Datenintegritätslogik in Ihrer Anwendung wird die in RDBMS bereits durchgeführte Arbeit wiederholt. Belassen Sie die Datenlogik in der Datenbank.
Thomas Stringer
@TomTom - "Theoretisch ungültige Daten sollten niemals in die Datenbank gelangen, aber Integrität ist die letzte Verteidigungslinie." Einverstanden. Dieses ausgefallene AJAX-Formular erspart Ihren Endbenutzern viel Kopfzerbrechen, indem es ihre Eingaben im Voraus überprüft. Diese Datenbankeinschränkungen sparen Ihrem Unternehmen und Ihren Ingenieuren ebenso viel Zeit, Geld und Energie, da sie nach fehlerhaftem Code nicht mehr sauber sind .
Nick Chammas
6

Es ist gängige Praxis, Einschränkungen (Fremdschlüssel, CHECK usw.) und Indizes zu löschen, wenn Sie ausreichend Daten laden, und die Einschränkungen und Indizes anschließend erneut zu aktivieren / implementieren. Diese Validierung kostet Zeit. Dies setzt voraus, dass Sie keine datenbankspezifische Massenladesyntax verwenden können (einschließlich Minimierung der Protokollierung).

Es ist unmöglich zu sagen, wie viel Leistungssteigerung zu erwarten ist - jede Situation ist einzigartig (Datentypen, Design usw.). Der einzige Weg, um wirklich zu wissen, ist zu testen.

OMG Ponys
quelle
1
+1. Beachten Sie jedoch, dass dies ein Sonderfall ist - im Allgemeinen werden Daten nicht verarbeitet, und es wird davon ausgegangen, dass die Daten korrekt sind, und der Schritt zum erneuten Erstellen des Index wird trotzdem ausgeführt. Dies ist eine Technik auf Data Warehosue-Ebene.
TomTom,
3

Es gibt einige Male, in denen Einschränkungen im Weg stehen:

  1. Wenn Sie Single Table Inheritance (STI) verwenden müssen. Stellen Sie sich vor, Sie verkaufen sowohl an Einzelpersonen als auch an Organisationen. Sie benötigen eine einzelne "Party" -Tabelle, deren Zeile entweder eine Einzelperson oder eine Organisation ist. STI bedeutet, dass Sie einige nullfähige Felder benötigen, die nicht null sein dürfen. Die Vererbung von Klassentabellen behebt dieses Problem, was jedoch für einige ORMs schwieriger ist. Rubys ActiveRecord unterstützt beispielsweise nur STI.

  2. Wenn Sie Entwurfsversionen einer Entität unterstützen müssen, ist dies möglicherweise nicht vollständig gültig. Sie könnten einen Entwurf als json speichern, aber dann ist es schwieriger, denselben Bezeichner auf dem Client wiederzuverwenden. Stellen Sie sich vor, er wurde mit id = 5 gespeichert, so bearbeitet, dass er ungültig ist, und als draftid = 99 automatisch gespeichert. In diesem Fall müssen wahrscheinlich alle Ihre Felder nullfähig sein.

Neil McGuigan
quelle