【问题标题】:mantaining referential integrity across multiple tables跨多个表维护参照完整性
【发布时间】:2017-05-27 05:57:12
【问题描述】:

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

【问题讨论】:

  • 在这个模式中,它应该比DomainsServers 有一个customer_id 引用,不是吗?
  • 一台服务器可以供多个客户使用还是只供一个客户使用?
  • @McNets 是的,没错。
  • @Renzo 服务器只能由客户使用。对不起,这个例子有点做作

标签: database postgresql database-design foreign-keys


【解决方案1】:

无需添加太多冗余(因此很危险)外键来解决您的问题。使用规范化模式就足够了,例如:

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 与属于不同客户的服务器和域,以及在应用程序内部检查修改的服务器和域是否属于当前客户。

【讨论】:

    【解决方案2】:

    根据我的拙见并根据您的架构,您应该为 Customer/ServersCustomer/Domains 添加一个多列 FK

    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),
    );
    

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多