Es kommt darauf an - oft ist ein mehrschichtiger Ansatz erforderlich.
Zum Beispiel können Sie eine Reihe von einfachen Geschäftsregeln haben, die direkt in der Datenbank als Prüfbedingungen gepflegt werden können. Ich benutze diese nur für einfache, in sich geschlossene Kontrollen.
Beispiel - ein Y/N-Flag überprüft:
alter table example_table add constraint ck_example_table_flag
check (flag is null or flag in ('Y', 'N');
In diesem Fall, wenn Sie einen anderen Wert in dieser Spalte erhalten Sie wissen, dass die Daten sind schlecht, und dies ist keine Regel Das wird sich im Laufe der Zeit ändern. Durch Hinzufügen dieser Einschränkung wird verhindert, dass eine Anwendung Ihre Daten beschädigt.
Für kompliziertere Geschäftsregeln, die möglicherweise nicht in sich abgeschlossen sind, zum Beispiel wenn ein Datum von der Person, die den Wert eingibt, oder vom Inhalt eines anderen Feldes in einer anderen Tabelle abhängt, würde ich das in der 'Anwendung' behandeln .
Manchmal ist die 'Anwendung' die Datenbank - in diesem Fall können Ihre Prüfbedingungen in Tabellenauslösern oder in einem gepackten pl/sql vorliegen, das alle Tabellenaktualisierungen verarbeitet. Zum Beispiel:
example_app.update_data(id => 1000, value => 'foo');
Ist dies, wie Sie Ihr Daten-Updates behandelt werden, es ist nichts falsch mit Ihrem Geschäftsregeln als Check-Einschränkungen Umgang, Trigger mit Schecks oder direkt im update_data
Verfahren.
In vielen Enterprise-Umgebungen werden die Anwendungsschicht und die Datenbankschicht von verschiedenen Teams gehandhabt. Wenn Sie in dem Team sind, das die Anwendungsebene unterstützt, ist es möglicherweise zu mühsam, eine Änderungsanforderung für das Datenbankteam zu stellen, um eine Prüfbedingung zu setzen. In diesem Fall wird das Hinzufügen von ein wenig Logik zur Anwendungsebene mehr bewirken einfach. Umgekehrt mag das Datenbankteam es einfacher finden.
@Bohemian makes an excellent point über die Verwendung von Prüfbedingungen, um die Datenintegrität zu erzwingen, wenn mehrere Clients vorhanden sind.