从一个表中分组多行?

时间:2016-06-12 19:29:03

标签: database database-design

我有一个项目表,通过联结表与图像表有多对多的关系。我还想为项目添加多个封面图像。

我有多个表,我想从images表中分组一些行。如果它是封面图像,我应该添加一个布尔值的列吗?或者我应该创建一个一对多的表格,其中包含我想要作为封面的图像的ID?如果我要添加一些列,如果大多数列值为空,那么它是不是多余的?

还有一个客户端和纪律表,我想从图像表中选择图像,但添加一些额外的列,如sortorder。

1 个答案:

答案 0 :(得分:0)

这两种技术都有其优点,答案可以基于意见;我的是。我建议您在图片表格中添加字段(例如cover),以指明图片是否为主图片。大多数行在cover字段中具有NULL值是可以的。在imageid和cover上创建索引。

我还建议创建名为CoverImages的视图select ... from images where cover=true,以便只需要封面图像的应用程序可以直接使用此视图。根据您的数据库引擎,您可以创建稀疏列和/或创建过滤索引。

另一个选项是将cover添加到具有projectid和imageid的联结表中。但是,这会违反第二种正常形式的数据库规范化,因为cover将是图像的属性,而不是项目。

当您添加更多标志时,您提到的选项 - 将封面图像的图像放在一对多表格中 - 可能会出现问题。如果图像被标记为敏感,则您必须创建另一个表并仅在其中放置敏感图像。

基于最后2个想法,我建议在图像表中添加cover标志。

修改

OP提醒说,imageid 1可能是project1的封面,但不是project2的封面。这意味着cover应该与联结表而不是图像表相关联。 2NF不会被违反