跨多个表保持参照完整性

时间:2017-01-12 08:00:52

标签: database postgresql database-design foreign-keys

See my diagram here

我遇到以下问题:客户可以拥有两种类型的资源:服务器和域。服务器可以服务多个域,域可以分配给多个服务器,但客户有一组固定的服务器和域分配给他。客户可以直接编辑域服务器映射表。如何防止客户分配不属于他的服务器,换句话说,如何确保域 - 服务器映射中插入的域和服务器具有相同的客户主键?

2 个答案:

答案 0 :(得分:0)

根据我的拙见,根据您的架构,您应该为https://Customer/Servers添加多列FK

Customer/Domains

答案 1 :(得分: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,以及如果修改的服务器和域属于当前内容,则检查应用程序内部顾客。