如何在不破坏普通形式的情况下构建多对多关系的连接表

时间:2013-12-22 22:13:07

标签: sql database-normalization junction-table

我有这两个表,公司和所有者。 现在他们都处于普通形式,但我需要在他们之间创建一个Many-to-Many关系,因为一个公司可以拥有许多所有者一个所有者可以拥有多个公司

我之前得到的答案是,向公司添加一组CompanyOwners(带有所有者UUID)是否会破坏普通表格It will break Normal Form,并且能够收集到可以使用的是{{3} },请参阅Junction Table

我的问题如下:将如下所示创建一个额外的连接表,打破正常形式?

-- This is the junction table.
CREATE TABLE CompanyOwners(
    Connection-ID UUID NOT NULL, // Just the ID (PK) of the relationship.
    Company-ID UUID NOT NULL REFERENCES Company (Company-ID),
    Owner-ID UUID NOT NULL REFERENCES Owner (Owner-ID),
    CONSTRAINT "CompanyOwners" PRIMARY KEY ("Connection-ID")
)

2 个答案:

答案 0 :(得分:1)

您的结构允许重复数据。例如,它允许这样的数据。 (UUID缩写为防止水平滚动。)

Connection_id            Company_id               Owner_id
--
b56f5dc4...af5762ad2f86  4d34cd58...a4a529eefd65  3737dd70...a359346a13b3
0778038c...ad9525bd6099  4d34cd58...a4a529eefd65  3737dd70...a359346a13b3
8632c51e...1876f6d2ebd7  4d34cd58...a4a529eefd65  3737dd70...a359346a13b3

关系中的每一行都应具有不同的含义。这个表允许数百万行表示同样的事情。

这些方面的东西更好。它在5NF。

CREATE TABLE CompanyOwners(
    Company_ID UUID NOT NULL references Company (Company_ID),
    Owner_ID UUID NOT NULL references Owner (Owner_ID),
    PRIMARY KEY (Company_ID, Owner_ID)
);

标准SQL不允许在标识符中使用“ - ”。

答案 1 :(得分:0)

这很好,但你可以添加几个列,比如

DateOwned Datetime  --<-- when the owner bought the company 
DateSold Datetime  --<-- when a the owner sold the compnay

毕竟你会想知道公司仍归同一所有者所有,并跟踪公司的所有权历史等。