多对一关系设计

时间:2012-09-18 09:53:36

标签: database database-design

目前,我们采用这种设计来存储具有多个图像/视频网址的对象:

tblCompany:
pkCompanyId

tblPerson:
pkPersonId

tblImage:
pkImageId
ImageUrl
fkCompanyId
fkPersonId

虽然这个设计处理:

  1. 拥有多个图片的公司
  2. 有多个影像的人
  3. 我不禁觉得这个设计存在问题,因为tblImage中的行将为外键列提供大量的NULL值。

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

2 个答案:

答案 0 :(得分:3)

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

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


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

enter image description here

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

答案 1 :(得分:1)

如果我正确理解架构,则公司和人员无关,并且两者都可以有一个或多个图像。然后你就可以拥有一张图像本身的表格和两张不同的表格,供公司用于图像和人物到图像的映射。

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

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