Sql 连接多个表的连接表
我有一个带有图像的表,我需要链接到其他6个表。假设这些表是-用户、表、食品、餐厅、类别和船舶 我是否应该创建6个不同的连接表,以便每个表都有自己的连接表-图像用户、图像表、图像餐厅等 还是创建一个带有字段的表来区分链接的位置更好- 带有字段-Id、Image\u Id、Entity\u Id、Entity\u Type的Images\u Entity(我用它来区分是用户表、食物还是其他)。我不喜欢这个解决方案,因为在这种情况下我将缺少FK约束,但我倾向于使用FK约束,因为项目将已经有大量的表 也许还有第三种方法?创建6个图像表?哪种解决方案的性能最好 编辑* 数据库将用于显示数据、插入、更新性能不是问题,只有select语句。我刚刚发现没有图像可以链接到两个条目(这使得连接表冗余) 让我完全重新表述这个问题-使用一对多关联将表与其他6个表中的一个表连接的最佳方式是什么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约束,因为项目将已经有大量的表 也
因此,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”字段)的怀疑是错误的。解决方案基于数据的使用方式。您没有说明数据库将如何使用,因此几乎没有什么信息可以给出一个有根据的答案。一对多在哪个方向?一个餐厅可以有很多图片,或者一个图片可以属于多个餐厅?一个餐厅可以有很多图片,一个图片可能只属于一个餐厅。