如何构建表模型互斥1:n关系?

时间:2008-11-04 21:47:16

标签: sql database-design normalization foreign-key-relationship

在下表结构中:

Fruits 
(
    fruit_id,
    fruitName
)


Vegetables
(
    vegetable_id,
    vegetableName
)

favoriteFoods 
(
     food_id,
     foodName,
     type_id (References either a fruit or a vegetable)
)

我意识到我可以放弃在favoriteFoods表上使用外键约束,然后只需在favoriteFoods表中添加一个类型字段来区分水果和蔬菜。但是,如何构建表以便实际创建必要的外键约束?

2 个答案:

答案 0 :(得分:4)

我只会使用2个表。而不是单独的水果和蔬菜表,为什么不有一个食品表。然后在fkfood_id到food_id上有一个外键约束。然后,如果由于某种原因你必须添加肉,那么维护使用它的应用程序会容易得多。

Food
    (
    food_id,
    foodName,
    foodType
    )

favoriteFoods
    (
    favoritefood_id,
    fkfood_id
    )

答案 1 :(得分:0)

这取决于您将如何处理数据。

如果由于某种原因归一化对您很重要,以下情况就会很好。

Fruits (    
     fruit_id,
     food_id references favoritefoods.food_id,
     fruitName)
Vegetables(
     vegetable_id,
     food_id references favoritefoods.food_id,
     vegetableName)
favoriteFoods (
     food_id,
     foodName)

最喜欢的食物表不需要“知道”它是什么类型的食物,如果有的话。每种水果和每种蔬菜都与相应的食物结合在一起。

如果您想从favoriteFoods中选择所有水果,只需加入水果表和favoriteFoods表。你甚至可以把番茄当作蔬菜和水果,如果这适合你的想象。

以上是基于连接便宜的假设。在许多情况下,连接真​​的很便宜。在更改设计之前检查它以避免连接。