これはデータベース設計における一般的な問題であり、対処する最も一般的な方法が 3 つあります (EAV を含めると 4 つ)。
各タイプに 1 つずつ、3 つの個別のテーブル。
多数の列を持つ 1 つのテーブル。そのうちのいくつかは Null を持つことが許可されます。整合性はデータベースでは簡単に処理できず (どの列の組み合わせが Null になり、どの列の組み合わせが Null にならないか)、通常はアプリケーションによって処理されます。これは@noaの答えであり、コードがわずかに少なくなり、おそらく(完全ではありませんが)動作するアプリケーションを簡単に作成できます。
1 つMember
のテーブル (これがスーパータイプ) と 3 つの追加テーブル (サブタイプごとに 1 つずつ)。これにより、組織の種類に応じて、Null を使用せず、使用する列を強制することができます。(これはオプション 1 です)
org_type
すべてのテーブルに列を追加することもできます。これは、追加のUNIQUE
制約Member (org_type, member_ID)
と、FOREIGN KEY
(各サブタイプ テーブルからの) 制約がこのorg_type
列を含むように変更されることを意味します。このようなもの:
CREATE TABLE Member
( MemberID
, Org_Type
, Name
, ...
, Role
, PRIMARY KEY (MemberID)
, UNIQUE KEY (Org_Type, MemberID)
, CHECK Org_Type IN (1, 2, 3)
) ;
CREATE TABLE Member_Type_1
( MemberID
, Org_Type
, Location
, PRIMARY KEY (MemberID)
, FOREIGN KEY (Org_Type, MemberID)
REFERENCES Member(Org_Type, MemberID)
, CHECK Org_Type = 1
) ;
and finally there's (your option 2) EAV:
- Wikipediaによると、Entity-Attribute-Valueモデルは次のとおりです。
エンティティを記述するために使用できる属性 (プロパティ、パラメーター) の数が膨大になる可能性がありますが、特定のエンティティに実際に適用される数は比較的少ないエンティティを記述するためのデータ モデル。数学では、このモデルは疎行列として知られています。EAV は、オブジェクト - 属性 - 値モデル、垂直データベース モデル、およびオープン スキーマとしても知られています。
リレーショナル データベースで EAV を使用しない理由はさまざまです。その主な理由は、データ型と参照整合性に関する問題 (これは簡単に強制することはできません)、単純なクエリでさえも作成するのが難しい (多くの結合で作成される)、および効率性です。DBA.SE の質問で Simon Righarts による回答を参照してください: Is there a name for this database structure?
ただし、Aaron Bertrand の記事で説明されているように、特定の場合に有効なオプションである理由があります。、特に列の数が多い場合や、必要な列が事前にわからない場合 (顧客によるカスタムメイド) はさらに多くなります。組織がカスタム列を追加できるようにしたい場合は、それがあなたのケースかもしれません。
ただし、効率的な EAV モデル/アプリケーションを構築するのは簡単ではないことに注意してください。実際にデータベース内に RDBMS を構築しています。