【问题标题】:Database design best practices - linking/junction table with multiple references数据库设计最佳实践 - 具有多个引用的链接/联结表
【发布时间】:2015-09-22 10:46:10
【问题描述】:

我有以多对多关系的membership_person链接表链接在一起的membership和person表(列:person_id和membership_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

处理上述问题的数据库最佳实践是什么?我应该创建一个单独的链接表,例如membership_address、membership_phone 和membership_email?或者只是将 address_id、phone_id、email_id 添加到现有的 members_person 表中?

谢谢:)

【问题讨论】:

  • 您说地址与会员资格相关联,而不是与人相关联。个人和会员资格之间存在多对多关系,会员资格和地址之间存在一对一关系。
  • 多人可以拥有相同的会员资格吗?如果没有,membership_person 链接表似乎是不必要的。
  • 是的,马克,一个人可以有 0 个或多个会员资格,一个会员资格可以有一个或多个人。
  • @GilbertLeBlanc,会员和地址之间也可以是多对多。请参阅第一个答案中的 cmets。

标签: database-design relational-database


【解决方案1】:

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

类似(使用mysql语法):

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)
)

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

【讨论】:

  • 非常感谢波西米亚人的快速回复。我今天早上向团队提出了相同的解决方案,但争论的是这是否被规范化。对我来说它看起来非常好,除了用户想要拥有 2 个首选地址而不是一个的情况。这显然需要向表中添加另一个 address_id。或者你怎么看?
  • 是 - 为辅助地址添加另一列。此外,您仍然可以通过定义两列外键约束来获得要求关联表中引用的地址属于该行中的人员的引用完整性:foreign key (person_id, address_id) references address(person_id, address_id)
  • 感谢 Bohemian,这应该可以解决混乱 :)
【解决方案2】:

扩展,下面是一个建议。

表格:Membership_Person

复合主键(membership_id、person_id、table_id、优先级)

字段

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多