ホームページ >データベース >mysql チュートリアル >継承を伴うデータベース設計で 1 対 1 の関係を効果的に確立し、強制する方法は?
課題: 複雑なデータベース構造では、多くの場合 1 対 1 の関係が必要です。 中央の Storage
テーブルが Van
テーブルと Warehouse
テーブルの両方にリンクされているシナリオは、この課題を示しています。 これらの関係を効果的に確立して維持し、データの整合性を確保するにはどうすればよいでしょうか?
データベース設計における継承戦略:
データベースで継承を表現するには、いくつかのアプローチが存在します。
最適なソリューション: クラステーブルの継承とアプリケーションレベルの強制
Storage
、Van
、および Warehouse
のシナリオでは、「クラス テーブルの継承」方法が推奨されます。 ただし、子エンティティ関係の存在と排他性の両方を強制するには、アプリケーション レベルのチェックが必要です。
Storage
または Van
レコードに対して Warehouse
レコードを保証します。Storage
レコードが 1 つの Van
または 1 つの Warehouse
レコードにのみリンクされていることを確認します。両方にはリンクしないでください。外部キー制約は役立ちますが、完全な排他性を実現するには、クライアントによる競合する可能性のあるテーブルの直接更新を防ぐストアド プロシージャとアプリケーション レベルのロジックが必要になる場合があります。 Microsoft SQL Server には遅延制約がないため、純粋に制約ベースのソリューションが複雑になります。
代替案: 遅延制約なしで排他性を強制する
別の方法では、STORAGE_TYPE
列を追加することで遅延制約を回避します。
STORAGE_TYPE
列が 0 に設定されます。STORAGE_TYPE
列が 1 に設定されます。次に、一意の制約が (STORAGE_ID
、STORAGE_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_ID
が Van
または Warehouse
のいずれかにのみ関連付けられることが保証され、1 対 1 の関係の排他性が強制されます。 ただし、プレゼンスにはアプリケーション レベルの検証が必要です。
以上が継承を伴うデータベース設計で 1 対 1 の関係を効果的に確立し、強制する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。