【问题标题】:Database design - defining a basic many-to-one relationship数据库设计 - 定义基本的多对一关系
【发布时间】:2011-05-28 08:33:13
【问题描述】:

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

PrimaryCustomerID  RelationshipID  SecondaryCustomerID

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

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

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

设置的正确方法是什么?

【问题讨论】:

    标签: database database-design normalization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        No 3 没什么问题。

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • > 复合键或全键表原则上没有问题。好的,谢谢。
          猜你喜欢
          • 2012-09-30
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 2014-11-06
          • 2011-05-01
          • 2011-08-23
          • 2011-04-13
          相关资源
          最近更新 更多