2017-01-12 3 views
0

See my diagram heremantaining ссылочной целостности по нескольким таблицам

У меня есть следующая проблема: клиент может иметь 2 типа ресурсов: серверов и доменов. Сервер может обслуживать несколько доменов, а домен может быть выделен на несколько серверов, но у клиента есть фиксированный набор серверов и доменов, выделенных ему. Клиент может непосредственно редактировать таблицу отображения домена-сервера. Как я могу помешать клиенту распределять серверы, которые ему не принадлежат, другими словами, как я могу убедиться, что домен и сервер, вставленные в сопоставление доменного сервера, имеют один и тот же первичный ключ клиента?

+0

В этой схеме предполагается, что либо «Домены», либо «Серверы» имеют ссылку «customer_id», не так ли? – McNets

+0

Сервер может использоваться несколькими клиентами или только одним клиентом? – 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/Servers и Customer/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), 
); 
Смежные вопросы