Database design 数据库设计最佳实践-具有多个引用的链接/连接表

Database design 数据库设计最佳实践-具有多个引用的链接/连接表,database-design,relational-database,Database Design,Relational Database,我将成员和人员表与成员\人员链接表以多对多关系链接在一起(列:person\ u id和membership\ u id) 每个人都可以有一个或多个地址、电话和电子邮件。这些存储在单独的表中,例如地址表、电话表和电子邮件表 我现在面临的新情况是,一个人拥有多个会员资格,但他/她更喜欢为每个会员使用不同的地址、电话号码和电子邮件 以下是一个例子: M1 => P1 => address-1 => phone-1 => Email-1 M2 =>

我将成员和人员表与成员\人员链接表以多对多关系链接在一起(列:person\ u id和membership\ u id)

每个人都可以有一个或多个地址、电话和电子邮件。这些存储在单独的表中,例如地址表、电话表和电子邮件表

我现在面临的新情况是,一个人拥有多个会员资格,但他/她更喜欢为每个会员使用不同的地址、电话号码和电子邮件

以下是一个例子:

M1 => P1 
   => address-1 
   => phone-1 
   => Email-1

M2 => P1 
   => address-2 
   => phone-2 
   => Email-2

M3 => P1 
   => address-3 
   => phone-3 
   => Email-3
处理上述问题的数据库最佳实践是什么?我是否应该创建一个单独的链接表,如会员地址、会员电话和会员电子邮件?或者只需将地址、电话号码、电子邮件号码添加到现有的会员人数表中

谢谢:)

这称为关联数据—关于两个实体之间关联的数据—您将其存储在关联表中

类似(使用mysql语法):

额外的3列为每个成员定义一个人的联系人实体。

这称为关联数据-关于两个实体之间关联的数据-并存储在关联表中

类似(使用mysql语法):


额外的3列定义了每个成员的联系人实体。

下面是一个建议

表格:会员人数

复合主键(成员id、人员id、表id、优先级)

字段

  • 成员身份\u id-引用成员身份表
  • person_id-引用person表
  • table_id-表示电话、地址或电子邮件表作为此行的引用表
  • 表\u条目\u id-引用表的主键
  • 优先级-此人的首选条目+会员资格+(电话、, 地址(或电子邮件)

    • 扩展,下面是一个建议

      表格:会员人数

      复合主键(成员id、人员id、表id、优先级)

      字段

      • 成员身份\u id-引用成员身份表
      • person_id-引用person表
      • table_id-表示电话、地址或电子邮件表作为此行的引用表
      • 表\u条目\u id-引用表的主键
      • 优先级-此人的首选条目+会员资格+(电话、, 地址(或电子邮件)

      你说地址与会员有关,而不是与个人有关。您的个人和会员之间存在多对多关系,会员和地址之间存在一对一关系。多个人可以拥有相同的会员资格吗?如果不是,则“成员资格\人员”链接表似乎不必要。标记“是”,一个人可以有0个或多个成员资格,而一个成员资格可以有一个或多个人员。@GilbertLeBlanc,成员资格和地址之间也可以是多对多。请参阅第一个答案中的注释。您说地址与会员有关,而不是与个人有关。您的个人和会员之间存在多对多关系,会员和地址之间存在一对一关系。多个人可以拥有相同的会员资格吗?如果不是,则“成员资格\人员”链接表似乎不必要。标记“是”,一个人可以有0个或多个成员资格,而一个成员资格可以有一个或多个人员。@GilbertLeBlanc,成员资格和地址之间也可以是多对多。请参阅第一个答案中的评论。非常感谢您的快速回复波希米亚人。今天早上我向团队提出了同样的解决方案,但争论的焦点是这是否正常化。对我来说,它看起来非常好,除了用户希望有两个首选地址而不是一个。这显然需要向表中添加另一个地址id。或者你怎么想?是的-为次要地址添加另一列。此外,通过定义两列外键约束,您仍然可以具有引用完整性,要求关联表中引用的地址属于该行中的人员:
      外键(person\u id,address\u id)引用地址(person\u id,address\u id)
      谢谢Bohemian,这应该可以解决困惑:)非常感谢波希米亚人的快速回复。今天早上我向团队提出了同样的解决方案,但争论的焦点是这是否正常化。对我来说,它看起来非常好,除了用户希望有两个首选地址而不是一个。这显然需要向表中添加另一个地址id。或者你怎么想?是的-为次要地址添加另一列。此外,通过定义两列外键约束,您仍然可以具有引用完整性,要求关联表中引用的地址属于该行中的人员:
      外键(人员id,地址id)引用地址(人员id,地址id)
      谢谢Bohemian,这应该可以解决混淆:)
      create table membership_person (
          person_id int not null references person,
          membership_id int not null references membership,
          address_id int not null references address,
          phone_id int not null references phone,
          email_id int not null references email,
          primary key (person_id, membership_id)
      )