连接多个表的连接表

时间:2014-09-21 18:02:56

标签: sql database database-design

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

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

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

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

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

让我完全重新提问 - 使用一对多关联将表连接到其他6个表中的一个表的最佳方法是什么?

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

2 个答案:

答案 0 :(得分:2)

一种可能的方法是在UserId表格中添加RestaurantIdTableIdFoodIdImages等。

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

通过这种方式,你可以很容易地想要拥有所有规则。

使用单独的联结表,这很难管理。为Table_Image插入联结行时,必须验证其他联结表中的任何其他实体是否没有此类记录。

答案 1 :(得分:1)

您可以使用this post中所述的独占FK 继承

如果你选择前者,那么用于独家FK的CHECK需要使用稍微不同的语法(来自链接中使用的语法)才能实用:

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是非NULL的。

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