Sql 连接多个表的连接表

Sql 连接多个表的连接表,sql,database,database-design,Sql,Database,Database Design,我有一个带有图像的表,我需要链接到其他6个表。假设这些表是-用户、表、食品、餐厅、类别和船舶 我是否应该创建6个不同的连接表,以便每个表都有自己的连接表-图像用户、图像表、图像餐厅等 还是创建一个带有字段的表来区分链接的位置更好- 带有字段-Id、Image\u Id、Entity\u Id、Entity\u Type的Images\u Entity(我用它来区分是用户表、食物还是其他)。我不喜欢这个解决方案,因为在这种情况下我将缺少FK约束,但我倾向于使用FK约束,因为项目将已经有大量的表 也

我有一个带有图像的表,我需要链接到其他6个表。假设这些表是-用户、表、食品、餐厅、类别和船舶

我是否应该创建6个不同的连接表,以便每个表都有自己的连接表-图像用户、图像表、图像餐厅等

还是创建一个带有字段的表来区分链接的位置更好- 带有字段-Id、Image\u Id、Entity\u Id、Entity\u Type的Images\u Entity(我用它来区分是用户表、食物还是其他)。我不喜欢这个解决方案,因为在这种情况下我将缺少FK约束,但我倾向于使用FK约束,因为项目将已经有大量的表

也许还有第三种方法?创建6个图像表?哪种解决方案的性能最好

编辑* 数据库将用于显示数据、插入、更新性能不是问题,只有select语句。我刚刚发现没有图像可以链接到两个条目(这使得连接表冗余)

让我完全重新表述这个问题-使用一对多关联将表与其他6个表中的一个表连接的最佳方式是什么


因此,Images表应该包含FK,并且只能链接到6个表中的一个,不能同时链接到两个。

一种可能的方法是在
Images表中添加
用户ID
RestaurantId
表ID
FoodId

这样,您就可以向这些列中的每一列添加适当的FK。 使用约束或触发器(取决于DBMS),您可以强制这些字段中只有一个是
NOTNULL
。填写的id的实际验证由FK约束处理

这样,执行您想要的所有规则就相当容易了


使用单独的连接表,这更难管理。在为表\图像插入连接行时,必须验证其他连接表中的任何其他实体是否没有此类记录

您可以使用独占FKs继承,如中所述

如果您选择前者,则排他性FK使用的检查将需要使用稍微不同的语法(与链接中使用的语法不同)才能实用:

CHECK (
    (
        CASE WHEN UserID         IS NULL THEN 0 ELSE 1 END
        + CASE WHEN TableID      IS NULL THEN 0 ELSE 1 END
        + CASE WHEN FoodID       IS NULL THEN 0 ELSE 1 END
        + CASE WHEN RestaurantID IS NULL THEN 0 ELSE 1 END
        + CASE WHEN CategoryID   IS NULL THEN 0 ELSE 1 END
        + CASE WHEN ShipID       IS NULL THEN 0 ELSE 1 END
    )
    = 1
)

上述检查确保在任何给定时间,只有一个FK为非空


顺便说一句,您对“dynamic”FK(带有“type”字段)的怀疑是错误的。

解决方案基于数据的使用方式。您没有说明数据库将如何使用,因此几乎没有什么信息可以给出一个有根据的答案。一对多在哪个方向?一个餐厅可以有很多图片,或者一个图片可以属于多个餐厅?一个餐厅可以有很多图片,一个图片可能只属于一个餐厅。