【发布时间】:2016-06-12 19:29:03
【问题描述】:
我有一个通过联结表与图像表具有多对多关系的项目表。我还想为一个项目添加多个封面图片。
我有多个表,我想对图像表中的一些行进行分组。如果它是封面图像,我应该添加一个带有布尔值的列,还是应该创建一个带有我想要作为封面的图像的 ID 的一对多表?如果我要添加一些列,如果大多数列值都为空,那会不会是多余的?
还有一个客户和学科表,我想从图像表中选择图像,但添加一些额外的列,如排序顺序。
【问题讨论】:
我有一个通过联结表与图像表具有多对多关系的项目表。我还想为一个项目添加多个封面图片。
我有多个表,我想对图像表中的一些行进行分组。如果它是封面图像,我应该添加一个带有布尔值的列,还是应该创建一个带有我想要作为封面的图像的 ID 的一对多表?如果我要添加一些列,如果大多数列值都为空,那会不会是多余的?
还有一个客户和学科表,我想从图像表中选择图像,但添加一些额外的列,如排序顺序。
【问题讨论】:
这两种技术都有其优点,答案可以基于意见;我的是。我建议在您的图像表中添加字段(例如cover),以指示图像是否是主要图像。大多数行在 cover 字段中具有 NULL 值是可以的。在 imageid 和封面上创建索引。
我还建议创建一个名为 CoverImages 的视图,该视图将是 select ... from images where cover=true,以便任何只需要封面图像的应用程序都可以直接使用此视图。根据您的数据库引擎,您可能能够创建稀疏列和/或创建过滤索引。
另一个选项是将cover 添加到具有 projectid 和 imageid 的连接表中。但是,这将违反数据库规范化的第二范式,因为cover 将是图像的属性,而不是项目的属性。
您提到的选项 - 将作为封面图像的图像放在一对多表中 - 当添加更多标志时可能会出现问题。如果图像被标记为敏感,则必须创建另一个表并仅将敏感图像 ID 放入其中。
基于最后两个想法,我建议将cover 标志放在图像表中。
编辑
OP 提醒,imageid 1 可以作为 project1 的封面,但不能作为 project2 的封面。这意味着cover 应该与联结表而不是图像表相关联。不会违反2NF
【讨论】:
cover 添加到联结表中,因为该属性与项目和图像相关联——并且不会违反第二范式。好点子。