【问题标题】:Group multiple rows from one table?将一张表中的多行分组?
【发布时间】:2016-06-12 19:29:03
【问题描述】:

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

我有多个表,我想对图像表中的一些行进行分组。如果它是封面图像,我应该添加一个带有布尔值的列,还是应该创建一个带有我想要作为封面的图像的 ID 的一对多表?如果我要添加一些列,如果大多数列值都为空,那会不会是多余的?

还有一个客户和学科表,我想从图像表中选择图像,但添加一些额外的列,如排序顺序。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    这两种技术都有其优点,答案可以基于意见;我的是。我建议在您的图像表中添加字段(例如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 添加到联结表中,因为该属性与项目和图像相关联——并且不会违反第二范式。好点子。
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多