データ層で制約によってデータの一貫性を強制すると、データの一貫性が維持され、アプリケーション内で低コストのランタイム バグ チェックが提供されます。
制約に価値がないと思われる場合は、小規模/非ミッション クリティカルなシステムを使用しているか、システムの品質を向上させる大きなチャンスを逃していることになります。これは控えめに言っても過言ではありません。
選択肢には、別の RDBMS を選択する、独自のメタデータ システムを再発明する、制約を手動で管理するなどがあります。スキーマ/システムの複雑さが増し、進化するスキーマが不必要に複雑になるにつれて、メタデータ システムを使用しないクエリの手動管理は、適切に維持および監査することがすぐに不可能になります。
別の RDBMS を選択することをお勧めします。
整合性チェックは、想像以上に難しいものです。たとえば、MySQL はトランザクション読み取り一貫性を使用します。これは、チェック対象の値が別のトランザクションのスコープ内で同じ値ではない可能性があることを意味します。データ層に直接バインドされていない場合、同時アクセスの一貫性スキーマを正しく理解することは非常に困難です。
結局のところ、手作業によるチェックに多少の労力を費やしたとしても、考慮に入れなかった、または形成時にエラーを犯したコーナーケースをトラックで通過できる可能性が高い.
NOT NULL の質問について... 明らかなデータ フィールドの要件は、出発点として適切です。列の NULL 可能性を定義する際に考慮すべき事項が他にもいくつかあります。
クエリを作成するときに非常に役立つ保証を提供します。さまざまな結合で NULL 条件を使用して、条件が NULL を許可する場合に想定できない NULL 値とは別に、テーブルの行が一致しないことを示す場合があります。(NULL が許可されている場合、一致は、行が一致しなかったか、行は一致したが列の値が null であることを意味します。)
NOT NULL を使用すると、値に一致するより単純なクエリのルールを定義するのにも役立ちます。value1 と value2 の両方が NULL の場合、「WHEN value1 = value2」とは言えないため、評価の結果は依然として false です。