2014-09-21 60 views
0

我有一张带有图像的表格,需要链接到其他6个表格。假设这些表格是 - 用户,表格,食物,餐馆,类别和船舶。连接多个表格的连接表格

我应该创建6个不同的联结表,以便每个表都有它自己的联结表 - Images_Users,Images_Tables,Images_Restaurants等。

或者是更好地创建一个表与字段来区分它的链接 - Images_Entity与字段Id,Image_Id,Entity_Id,Entity_Type(我用它来区分它是一个用户表,食物或其他) 。我不喜欢这个解决方案,因为在这种情况下我将缺乏FK约束,但是我倾向于,因为项目已经有大量的表。

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

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

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

所以Images表应该包含FK,并且可以只链接到6个表中的一个,而不是两个在同一时间。

+1

该解决方案基于如何使用数据。您没有提供数据库如何使用的指示,因此只有很少的信息才能给出明智的答案。 – 2014-09-21 18:06:23

+0

添加说明。 – 2014-09-21 18:34:35

+0

一对多在哪个方向?一家餐厅可以有多张图片,或者一张图片可以属于多家餐馆? – GolezTrol 2014-09-21 18:50:53

回答

1

this post描述你可以使用独家FKS继承

如果你选择前者,独家FKS采用的检查将需要使用稍微不同的语法(从什么是在链接中使用)是可行的:

enter image description here

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 
) 

的上面的CHECK确保在任何给定时间只有一个FK是非空的。

顺便说一句,你对“动态”FK(“类型”字段)的怀疑是correct

2

一种可能的方法是将UserIdRestaurantIdTableIdFoodId等添加到Images表。

这样,您可以将适当的FK添加到每个这些列。 使用约束或触发器(取决于DBMS),您可以强制确定其中一个字段为not null。这个填充id的实际验证由FK约束来处理。

通过这种方式,您可以很容易地在所有您想要的规则之前生效。

对于单独的联结表,这很难管理。当为Table_Image插入联结行时,您必须验证其他联结表中的任何其他实体是否不存在此类记录。