数据库设计 - 定义基本的多对一关系

时间:2010-12-20 16:26:38

标签: database database-design normalization

这是一个基本的数据库设计问题。我想要一个表(或多个表)来定义客户之间的关系。我想要它,所以PrimaryCustomer可以链接到多个SecondaryCustomer,并且可以有许多具有相同关系的SecondaryCustomer。

PrimaryCustomerID  RelationshipID  SecondaryCustomerID

1)如果主键是{PrimaryCustomerID},那么我只能拥有一个任何类型的链接客户。

2)如果主键是{PrimaryCustomerID, RelationshipID},那么每种关系类型只能有一个链接客户。

3)如果主键是{PrimaryCustomerID, RelationshipID, SecondaryCustomerID},那么我可以拥有我喜欢的任何内容,但将所有列作为主键似乎完全错误。

什么是正确的设置方法?

4 个答案:

答案 0 :(得分:1)

第三种替代方案可能是密钥(PrimaryCustomerId,SecondaryCustomerId),如果每对客户只允许一种类型的关系,这将是有意义的。应该通过表中需要表示的依赖关系来定义要实现的键,以便表格准确地表示您正在建模的现实。复合键或全键表原则上没有任何问题。

答案 1 :(得分:0)

3号是这种数据模型的正确方法。链接表通常具有连接中的所有列,因为它们所做的只是链接到其他表。

答案 2 :(得分:0)

如果客户只能链接到一个主要客户,那么您可以在客户表本身中使用简单的递归关系。

  • CustomerID as PK
  • PrimaryCustomerID为FK到CustomerID

答案 3 :(得分:0)

No 3没有错。

alt text

如果您需要防止反向关系重复,可以使用

ALTER TABLE CustomerRelationship 
ADD CONSTRAINT chk_id CHECK (PrimaryCustomerId < SecondaryCustomerId);