Sollte mein Multi-Server-RDBMS oder meine Anwendung die referenzielle Datenbankintegrität handhaben?

16

Sollten Elemente wie Fremdschlüssel, Einschränkungen, Standardwerte usw. vom Datenbankverwaltungssystem (in diesem Fall MS SQL 2005) oder der Anwendung verarbeitet werden? Ich habe von beiden Seiten Meinungen gehört und bin mir ehrlich gesagt nicht sicher, welchen Weg ich einschlagen soll.

Es besteht die Möglichkeit, dass wir uns über mehrere Server / Datenbanken erstrecken, und ich glaube nicht, dass Fremdschlüssel zwischen Verbindungsservern verwendet werden können. Darüber hinaus gibt es einige Zirkelverweise im Datenbankdesign, die mich daran hindern, ON UPDATE CASCADEalles zu nutzen.

Die Datenbank ist MS SQL 2005 (möglicherweise 2008) und alle Interaktionen mit ihr sollten über die Anwendung erfolgen.

Rachel
quelle
3
Ich muss hier etwas lernen, da ich mir nicht vorstellen kann, das RDBMS nicht zu verwenden.
Bigtang

Antworten:

10

Wenn die Möglichkeit besteht, dass die Datenbank außerhalb Ihrer Anwendung geändert wird, möchten Sie die Einschränkungen in der Datenbank. Wenn die Datenbank nichts anderes als das Back-End der Anwendung ist und immer sein wird, können Sie sie weglassen, obwohl ich sie nur für alle Fälle dokumentieren und sie wahrscheinlich nur behalten würde, wenn die Leistung nicht zu schlecht wäre. (Die Peoplesoft-Software funktioniert auf diese Weise - die Einschränkungen liegen in der Software, und (ich denke mir das nicht aus) sie führt alles als SYS unter Oracle aus.)

Sie möchten, dass solche Dinge von der Anwendung überwacht werden, damit diese intelligent reagiert und eine Datenbankfehlermeldung nicht im besten Fall an den Benutzer zurücksendet.

Und ja, dies ist eine doppelte Abdeckung, aber ohne diese wird es wahrscheinlich zu vermeidbaren Datenverfälschungen oder einer schlechten Benutzeroberfläche kommen.

David Thornley
quelle
5

Idealerweise beides. Sie sollten nicht nicht haben die DB damit umgehen, aber dann wieder, wenn die App mit Daten kommt , dass die DB ablehnen wird, dass ein Laufzeitfehler ist, so dass die App zumindest einige Code widmet sich der Bewahrung der referenziellen Integrität haben sollte. Außerdem ist das Einrichten der richtigen Einschränkungen in SQL in der Datenbank viel einfacher als das Einrichten von Code für die Datenbank auf der Clientseite. Dadurch wird der Arbeitsaufwand für die Datenbank erheblich reduziert.

Mason Wheeler
quelle
1

Wenn es wichtig ist, lassen Sie die Datenbank damit umgehen. Auf diese Weise müssen Sie sich keine Sorgen machen, dass jemand außerhalb Ihrer Anwendung auf die Datenbank zugreift und inkonsistente oder doppelte Daten ändert oder eingibt. Es sei denn, es handelt sich um anwendungsspezifische Inhalte auf hoher Ebene (z. B. "Nur Benutzer in Abteilung X mit einer Zugriffsklasse von ZZZ sollten zur Gruppe 999 gehören"), die jedoch normalerweise nicht als "referenzielle" Integrität bezeichnet werden.

TMN
quelle
1

Ich würde sagen, in die Datenbank setzen. Wenn Sie ein beständiges Framework verwenden, werden die Schlüssel automatisch abgeholt.

Lareau
quelle
1

Beides ist definitiv der richtige Weg. Sie möchten eine Überprüfungslogik in Ihrem Code, um fehlerhafte Aktualisierungen und Einfügungen zu verhindern und den Benutzern mitzuteilen, was falsch war und wie dies behoben werden kann. Und die Datenbank dort zu haben, um die Dinge zu stoppen. Wenn also etwas hereinkam und die Validierung nicht durchlief, würde es die Dinge auf der ganzen Linie nicht zerstören, ist eine gute Sache.

Sie sollten das Datenbankmaterial auf einem höheren Level halten. ZB referentielle Integrität erzwingen und vielleicht einige nicht null. Sorgen Sie sich jedoch nicht um die Einschränkung von Längen oder Formaten, da dies am besten für die gesamte Anwendung gerendert wird.

Wyatt Barnett
quelle