3

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

tblCompany:
pkCompanyId

tblPerson:
pkPersonId

tblImage:
pkImageId
ImageUrl
fkCompanyId
fkPersonId

虽然此设计处理:

  1. 拥有多个图像的公司
  2. 拥有多个图像的人

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

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

4

2 回答 2

3

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

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


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

在此处输入图像描述

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

于 2012-09-18T11:12:00.960 回答
1

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

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

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

于 2012-09-18T10:01:43.193 回答