Nach meiner Erfahrung enthielten viele der Projekte, die ich in der Vergangenheit gelesen habe, keine Beziehungsdefinitionen in der Datenbank, sondern sie definierten sie nur im Quellcode. Ich frage mich also, welche Vor- und Nachteile es hat, Beziehungen zwischen Tabellen in der Datenbank und im Quellcode zu definieren. Und die umfassendere Frage betrifft andere erweiterte Funktionen in modernen Datenbanken wie Kaskaden, Trigger, Prozeduren ... In meinen Gedanken gibt es einige Punkte:
In der Datenbank:
Korrigieren Sie Daten aus dem Design. Verhindern Sie Anwendungsfehler, die ungültige Daten verursachen können.
Reduzieren Sie den Netzwerk-Roundtrip zur Anwendung beim Einfügen / Aktualisieren von Daten, da die Anwendung mehr Abfragen durchführen muss, um die Datenintegrität zu überprüfen.
Im Quellcode:
Flexibler.
Besser bei der Skalierung auf mehrere Datenbanken, da die Beziehung manchmal datenbankübergreifend sein kann.
Mehr Kontrolle über die Datenintegrität. Die Datenbank muss nicht jedes Mal überprüft werden, wenn die Anwendung Daten ändert (Komplexität kann O (n) oder O (n log n) (?) Sein). Stattdessen wird es an die Anwendung delegiert. Und ich denke, der Umgang mit der Datenintegrität in der Anwendung führt zu ausführlicheren Fehlermeldungen als die Verwendung der Datenbank. Beispiel: Wenn Sie einen API-Server erstellen, die Beziehungen in der Datenbank definieren und ein Fehler auftritt (z. B. dass die Entität, auf die verwiesen wird, nicht vorhanden ist), wird eine SQL-Ausnahme mit einer Meldung angezeigt. Die einfache Möglichkeit besteht darin, 500 an den Client zurückzugeben, wenn ein "Interner Serverfehler" vorliegt und der Client keine Ahnung hat, was falsch läuft. Oder der Server kann die Nachricht analysieren, um herauszufinden, was falsch ist, was meiner Meinung nach eine hässliche, fehleranfällige Methode ist. Wenn Sie dies der Anwendung überlassen,
Gibt es noch etwas?
Bearbeiten: Wie Kilian betont, ist mein Standpunkt zu Leistung und Datenintegrität sehr falsch. Also habe ich bearbeitet, um meinen Punkt dort zu korrigieren. Ich verstehe vollkommen, dass es effizienter und robuster sein wird, wenn die Datenbank damit umgeht. Bitte überprüfen Sie die aktualisierte Frage und denken Sie darüber nach.
Edit: danke euch allen. Die Antworten, die ich erhalten habe, weisen alle darauf hin, dass die Einschränkungen / Beziehungen in der Datenbank definiert werden sollten. :). Ich habe noch eine Frage, da diese Frage nicht in den Geltungsbereich dieser Frage fällt. Ich habe sie gerade als separate Frage veröffentlicht: Behandle Datenbankfehler für API-Server . Bitte hinterlassen Sie einige Einblicke.