ホームページ >データベース >mysql チュートリアル >継承を伴うデータベース設計で 1 対 1 の関係を効果的に確立し、強制する方法は?

継承を伴うデータベース設計で 1 対 1 の関係を効果的に確立し、強制する方法は?

DDD
DDDオリジナル
2025-01-13 17:46:42478ブラウズ

How to Effectively Establish and Enforce One-to-One Relationships in Database Design with Inheritance?

継承を使用したデータベース設計における 1 対 1 の関係の実装と強制

課題: 複雑なデータベース構造では、多くの場合 1 対 1 の関係が必要です。 中央の Storage テーブルが Van テーブルと Warehouse テーブルの両方にリンクされているシナリオは、この課題を示しています。 これらの関係を効果的に確立して維持し、データの整合性を確保するにはどうすればよいでしょうか?

データベース設計における継承戦略:

データベースで継承を表現するには、いくつかのアプローチが存在します。

  • 単一テーブルの継承: すべてのエンティティ (親と子) は単一のテーブル内に存在します。
  • 具象テーブルの継承: 各子エンティティには独自のテーブルがあります。親テーブルが存在しません。
  • クラス テーブルの継承: エンティティ (親と子) ごとに個別のテーブルが作成されます。

最適なソリューション: クラステーブルの継承とアプリケーションレベルの強制

StorageVan、および Warehouse のシナリオでは、「クラス テーブルの継承」方法が推奨されます。 ただし、子エンティティ関係の存在と排他性の両方を強制するには、アプリケーション レベルのチェックが必要です。

  • 存在: すべての Storage または Van レコードに対して Warehouse レコードを保証します。
  • 排他性: Storage レコードが 1 つの Van または 1 つの Warehouse レコードにのみリンクされていることを確認します。両方にはリンクしないでください。

外部キー制約は役立ちますが、完全な排他性を実現するには、クライアントによる競合する可能性のあるテーブルの直接更新を防ぐストアド プロシージャとアプリケーション レベルのロジックが必要になる場合があります。 Microsoft SQL Server には遅延制約がないため、純粋に制約ベースのソリューションが複雑になります。

代替案: 遅延制約なしで排他性を強制する

別の方法では、STORAGE_TYPE 列を追加することで遅延制約を回避します。

  • Van テーブル: 計算された STORAGE_TYPE 列が 0 に設定されます。
  • ウェアハウス テーブル: 計算された STORAGE_TYPE 列が 1 に設定されます。

次に、一意の制約が (STORAGE_IDSTORAGE_TYPE) の組み合わせに適用されます。

<code class="language-sql">CREATE TABLE VAN (
    STORAGE_ID int PRIMARY KEY,
    STORAGE_TYPE AS CAST(0 as tinyint) PERSISTED,
    FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE)
);

CREATE TABLE WAREHOUSE (
    STORAGE_ID int PRIMARY KEY,
    STORAGE_TYPE AS CAST(1 as tinyint) PERSISTED,
    FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE)
);</code>

このアプローチでは、単一の STORAGE_IDVan または Warehouse のいずれかにのみ関連付けられることが保証され、1 対 1 の関係の排他性が強制されます。 ただし、プレゼンスにはアプリケーション レベルの検証が必要です。

以上が継承を伴うデータベース設計で 1 対 1 の関係を効果的に確立し、強制する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。