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

Database 数据库设计-定义基本的多对一关系,database,database-design,normalization,Database,Database Design,Normalization,这是一个基本的数据库设计问题。我需要一个表(或多个表)来定义客户之间的关系。我希望PrimaryCustomer可以链接到多个SecondaryCustomer,并且可以有多个具有相同关系的SecondaryCustomer PrimaryCustomerID RelationshipID SecondaryCustomerID 1) 如果主键是{PrimaryCustomerID},那么我只能有一个任何类型的链接客户 2) 如果主键是{PrimaryCustomerID,Relation

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

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

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

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


设置内容的正确方法是什么?

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

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

  • 客户ID作为PK
  • PrimaryCustomerID作为FK到CustomerID

    • 三号车没什么问题

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

      ALTER TABLE CustomerRelationship 
      ADD CONSTRAINT chk_id CHECK (PrimaryCustomerId < SecondaryCustomerId);
      
      ALTER表客户关系
      添加约束chk_id检查(PrimaryCustomerId
      第三种选择可能是密钥(PrimaryCustomerId,SecondaryCustomerId),如果每对客户只允许一种类型的关系,这是有意义的。应该根据需要在表中表示的依赖项来定义要实现的键,以便表准确地表示您正在建模的现实。复合键或所有键表原则上没有问题。

      >复合键或所有键表原则上没有问题。好的,谢谢。