ER ダイアグラムに示されている顧客とアカウントのテーブルを SQL で実装するにはどうすればよいですか。
- すべての顧客は正確に 1 つのアカウントを持っています。
- すべてのアカウントは、正確に 1 人の顧客に属します。
- 顧客が削除されると、関連するアカウント行も削除する必要があります
ER ダイアグラムに示されている顧客とアカウントのテーブルを SQL で実装するにはどうすればよいですか。
この関係では、2 つのテーブルはほとんど必要ありません。削除しても、それらの間には1対1の関係があります。それは、それらが同じものであると言うことにかなり近いです。通常、顧客は 2 つのアカウントを持つことができます。または、アクティブなアカウントを持たない顧客が存在する可能性があります。
1 つの方法は、再帰的な外部キー関係を使用することです。
create table customers as (
customerId identity(1, 1) primary key,
accountId int not null,
. . .
);
create table accounts as (
accountId identity(1, 1) primary key
customerId int not null references customers(customerId)
. . .
);
alter table customers add foreign key (accountId) references accounts(accountId) on delete cascade;
(identity()
例の便宜上使用しただけです。)
ただし、2 つのテーブルの参照を同期させる必要があるため、行の挿入と削除が非常に難しいことがわかります。これは、トランザクションまたはトリガーを使用するか、場合によっては更新可能なビューを使用して回避できます。
もう 1 つの方法は、1 つのテーブルをより「支配的」にし、それらの間で主キーを共有することです。
create table customers as (
customerId identity(1, 1) primary key,
accountId int not null,
. . .
);
create table accounts as (
customerId int primary key references customers(customerId)
. . .
);
これでは関係が完全には完成しません。これは、すべてのお客様が一致するアカウントを持っていることを保証するものではありません。その関係を元に戻そうとすると、データの変更で問題が発生します。
最後に、テーブルを 1 つだけ作成できますCustomerAccounts
。これは本当にあなたの問題を解決します。すべての列を 1 つのテーブルに入れることができ、2 つの「エンティティ」の削除と挿入が自動的に同期されます。