【问题标题】:Multiple one to many relationship design多重一对多关系设计
【发布时间】:2012-09-18 19:12:00
【问题描述】:

目前,我们有这样的设计来存储具有多个图像/视频 URL 的对象:

tblCompany:
pkCompanyId

tblPerson:
pkPersonId

tblImage:
pkImageId
ImageUrl
fkCompanyId
fkPersonId

虽然此设计处理:

  1. 一家拥有多张图片的公司
  2. 拥有多张图片的人

我不禁觉得这种设计存在问题,因为 tblImage 中的行对于外键列会有大量的 NULL 值。

有更好的设计吗?设计中的更多对象(一些与公司或个人无关,一些与公司或个人相关)将具有图像,因此当前设计的 tblImage 可能具有越来越多的外键。

【问题讨论】:

  • 一张图片是否总是有公司和人,或者只有一个或混合?
  • 一幅图像总是有一个外键引用(一个或另一个)。为了使用图像支持设计中的其他对象,我们将在图像表中添加一个新的外键 - 例如如果有一个不相关的“House”对象需要多个图像,我们会将 fkHouseId 添加到 tblImage。

标签: database database-design


【解决方案1】:

对于只有 2 个可以有图像的实体来说,这实际上是一个非常好的设计。是的,你会有很多 NULL,但替代品(例如单独的图像表,或特制的 1:N 链接表)也会有问题。

由于这是 1:N 关系,我们不需要任何额外的 M:N 联结/链接表。


如果您需要添加更多种类的可以具有图像的实体,您可以考虑继承,如下所示:

这样,图像将自动能够连接到任何继承自tblCommon 的实体,无论实体有多少种。不幸的是,关系 DBMS 不直接支持继承,因此您必须在 3 ways 之一中模拟它,每个都有自己的折衷方案。

【讨论】:

    【解决方案2】:

    如果我正确理解架构,则 Company 和 Person 是不相关的,两者都可以有一个或多个图像。然后,您可以只为图像本身提供一个表,并为公司到图像和个人到图像映射提供两个不同的表。

    tblCompany: pkCompanyId
    tblPerson: pkPersonId    
    tblImage: pkImageId ImageUrl    
    tblPersonImage: fkImageId fkPersonId    
    tblCompanyImage: fkImageId fkCompanyId
    

    此架构还使您将来也可以将图像与其他类型的实体(如产品)相关联。

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多