【问题标题】:Deal with many to many relationships in the same table处理同一张表中的多对多关系
【发布时间】:2019-12-04 23:15:38
【问题描述】:

我有一张公司名称和有关它们的信息的表格,包括一个地址列。企业名称可以有重复名称,地址可以有重复,但企业名称和地址不能重复。所以有一种多对多的排序关系,但这不是在两个表之间,而是在同一个表的两列之间。

这些字段中的一个或两个也需要是另一个表的外键。

我要创建桥接表吗?复合键?如果是复合键,我将如何在另一个表中将它们设为外键?

【问题讨论】:

    标签: sql-server database tsql database-design create-table


    【解决方案1】:

    您可能想要创建 3 个表。一个存储公司名称,另一个存储地址,然后是一个连接表,例如,business_adresses

    create table businesses (
        id int primary key,
        name varchar(50)
    );
    
    create table adresses (
        id int primary key,
        street varchar(200),
        city  varchar(200),
        country varchar(200)
    );
    
    create table business_adresses(
        business_id int,
        adress_id int,
        primary key (business_id, adress_id),
        foreign key (business_id) references businesses(id),
        foreign key (adress_id) references adresses(id)
    );
    

    通过这种设置,每个实体都有自己的表,并且信息不会重复,这与使用单个表时不同。同时,在联结表中,您可以通过主键(也可以是唯一键)有效地保证业务/实体元组的唯一性,并通过外键保持数据完整性。

    【讨论】:

    • business_addresses的主键是复合PK吗?
    • 是的,这是一个复合主键 (business_id, adress_id)。您还可以使用 indentity 列作为主键并在 (business_id, adress_id) 上设置唯一约束。
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2013-02-17
    • 2012-08-27
    • 2020-09-09
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多