当外键可以关联到不同的表时,如何保持数据库一致

时间:2019-01-17 02:08:36

标签: mysql database database-design foreign-keys

假设我在Fruits表中有一个水果列表(其中有ID列),在Cars表中有一个汽车列表(其中有一个列) ID等。现在,我要允许用户将评论发布到水果或汽车上,并将这些评论存储在名为Comments的表中。

如果我希望每个注释都与水果或汽车相关,那么我不能有一个简单的列ResponseTo来使该实体的外键ID远离“另一个表”,这很自然,因为其他表可以是两个表之一。

根据我认为可以满足此要求的解决方案,它们将是:

  1. 删除外键。将水果或汽车的ID存储在列ResponseTo中,并添加另一列CommentType,其为enum,可能的值为“ Car”或“ Fruit”。 缺点:没有外键,可能会积累指向不存在的实体的不一致数据,JOIN子句更加复杂,因为它取决于列值。
  2. 有两个表以供注释。 FruitComments,其中ResponseToFruits的外键。ID,其中CarCommentsResponseTo的外键。Cars缺点:结构重复,希望显示所有用户的评论时需要ID查询。
  3. UNION表中添加两列,将Comments的外键添加到FruitIDFruits,将ID的外键添加到CarIDCars,其中之一必须始终为ID才能使数据正确。 缺点:同样,NULL子句更加复杂,因为它取决于列值,可能会存储不一致的数据,这是因为要限制将其中一列存储的数据限制为{{1} }在MySQL引擎中。

就这些而言,个人而言,数字3对我来说似乎是最合理的。

但是有更好的方法吗?

0 个答案:

没有答案