2017-01-12 6 views
0

See my diagram here複数のテーブルで参照整合性を維持

私は次のような問題があります。顧客は2種類のリソースを持つことができます:サーバーとドメイン。サーバーは複数のドメインに対応することができ、ドメインは複数のサーバーに割り当てることができますが、顧客には固定のサーバーとドメインが割り当てられています。顧客は、ドメインサーバーマッピングテーブルを直接編集できます。顧客が自分に属していないサーバーを割り当てないようにするにはどうしたらいいですか。つまり、ドメインとサーバーマッピングに挿入されたドメインとサーバーが同じ顧客のプライマリキーを持つことを確認するにはどうすればいいですか?

私の愚見で
+0

このスキーマでは、 'Domains'と' Servers'のどちらかが 'customer_id'参照を持っていると思われますか? – McNets

+0

サーバーは複数の顧客または1人の顧客のみが使用できますか? – Renzo

+0

@McNetsはい正しいです。 – unlink

答えて

0

のためにあまりにも多くの冗長化(と危険なこの理由のために)を追加する必要はありませんあなたの問題を解決するための外部キー。例えばのように、正規化されたスキーマを使用するのに十分である:

create table Customers 
( 
    customer_id int primary key 
); 

create table Domains 
(
    domain_id int primary key, 
    customer_id int references Customers 
); 

create table Servers 
(
    server_id int primary key, 
    customer_id int references Customers 
); 

create table Domain_Server_Mapping 
(
    domain_id int references Domains, 
    server_id int references Servers, 
    primary key(domain_id, server_id) 
); 

その後、あなたは異なる顧客に属しているサーバーやドメインとテーブルDomain_Server_Mappingの挿入または更新を防ぐためのトリガと同様に、チェックを追加することができます変更されたサーバーとドメインが現在の顧客に属している場合は、アプリケーション内部で

0

とあなたのスキーマに従って、あなたはどちらかのマルチカラムFKを追加する必要がありますCustomer/ServersCustomer/Domains

create table Customers 
( 
    customer_id int primary key 
); 

create table Domains 
(
    customer_id int references Customers(customer_id), 
    domain_id int, 
    primary key(customer_id, domain_id) 
); 

create table Servers 
(
    customer_id int references Customers(customer_id), 
    server_id int, 
    primary key(customer_id, server_id) 
); 

create table DomainsServers 
(
    customer_id int references Customers(customer_id), 
    domain_id int, 
    server_id int, 
    primary key(customer_id, domain_id, server_id), 
    foreign key fk_domains (customer_id, domain_id) references Domains(customer_id, domain_id), 
    foreign key fk_servers (customer_id, server_id) references Servers(customer_id, server_id), 
); 
関連する問題