この質問が非常に古いことは知っていますが、まだ受け入れられた回答がないため、いくつかのアイデアがあります。
1 つの可能性は、ORDBMS 機能を使用することです。つまり、テーブルの継承を使用します。PostgreSQL では、次のようにモデル化できます。
(PostgresSQL の継承に関するドキュメントを参照してください http://www.postgresql.org/docs/9.3/static/ddl-inherit.html )
CREATE TABLE account
(
account_id INT,
PRIMARY KEY(account_id)
);
CREATE TABLE corporate_customer
(
company_name VARCHAR(32),
country_code CHAR(2),
PRIMARY KEY(company_name)
) INHERITS(account);
CREATE TABLE private_corp_customer
(
private_comp_id INT,
company_owner VARCHAR(32),
PRIMARY KEY(private_comp_int)
) INHERITS(corporate_customer);
CREATE TABLE public_corp_customer
(
stock_ticker VARCHAR(6),
PRIMARY KEY(stock_ticker)
) INHERITS(corporate_customer);
CREATE TABLE government_customer
(
dept_nbr INT,
country CHAR(2),
PRIMARY KEY(dept_nbr)
) INHERITS(account);
異なる DBMS ベンダーは、さまざまな方法でこれを実装します。PostgresSQL では、ここで説明する重要な注意事項がいくつかあります。
http://ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-3-table.html
特に、主キーと外部キーが継承されないという部分に注意してください。
DBMS の制限が気に入らない場合、またはオブジェクト リレーショナル機能を持たない DBMS を使用している場合は、上記の記事で提案されている代替手段を使用し、2 次キーを使用するという別のオプションがあります。これは次のようにモデル化されます。
CREATE TABLE account
(
account_id INT,
account_type INT NOT NULL,
PRIMARY KEY(account_id),
UNIQUE (account_id, account_type)
);
CREATE TABLE corporate_customer
(
account_id INT,
account_type INT NOT NULL CHECK(account_type IN (1,2)),
company_name VARCHAR(32),
country_code CHAR(2),
PRIMARY KEY(account_id, account_type),
FOREIGN KEY(account_id, account_type) REFERENCES account(account_id, account_type),
UNIQUE(account_id, account_type, company_name)
);
CREATE TABLE private_corp_customer
(
account_id INT,
account_type INT NOT NULL CHECK(account_type = 1),
company_name VARCHAR(32),
company_owner VARCHAR(32),
PRIMARY KEY(account_id, account_type, company_name),
FOREIGN KEY(account_id, account_type, company_name) REFERENCES corporate_customer (account_id, account_type, company_name)
);
CREATE TABLE public_corp_customer
(
account_id INT,
account_type INT NOT NULL CHECK (account_type = 2),
company_name VARCHAR(32),
stock_ticker CHAR(6),
PRIMARY KEY(account_id, account_type, company_name),
FOREIGN KEY(account_id, account_type, company_name)
REFERENCES corporate_customer (account_id, account_type, company_name)
) INHERITS(corporate_customer);
CREATE TABLE government_customer
(
account_id INT,
account_type INT NOT NULL CHECK(account_type = 3),
dept_nbr INT,
country_code CHAR(2),
PRIMARY KEY(account_id, account_type),
FOREIGN KEY(account_id, account_type) REFERENCES account(account_id, account_type),
UNIQUE(account_id, account_type, dept_nbr)
);
上記の設計にもいくつかの重要な制限があります (上記の記事でも説明されています)。1 つには、個人、公的、または政府の顧客以外のアカウントを持つことは可能であってはなりませんが、そうすることが可能です。パブリックでもプライベートでもない企業アカウントだけを持つことができます...維持するのは悪夢になります. 制約によってパフォーマンスも低下するCHECK
可能性があり、子エンティティにデータの重複があり、企業の子エンティティ (country_code) に情報が欠落していることに気付くでしょう。
どの制限を選択するかは、DBMS ベンダーと、管理したい問題の程度によって異なります。