假设我在Fruits
表中有一个水果列表(其中有ID
列),在Cars
表中有一个汽车列表(其中有一个列) ID
等。现在,我要允许用户将评论发布到水果或汽车上,并将这些评论存储在名为Comments
的表中。
如果我希望每个注释都与水果或汽车相关,那么我不能有一个简单的列ResponseTo
来使该实体的外键ID远离“另一个表”,这很自然,因为其他表可以是两个表之一。
根据我认为可以满足此要求的解决方案,它们将是:
ResponseTo
中,并添加另一列CommentType
,其为enum
,可能的值为“ Car”或“ Fruit”。 缺点:没有外键,可能会积累指向不存在的实体的不一致数据,JOIN
子句更加复杂,因为它取决于列值。FruitComments
,其中ResponseTo
是Fruits
的外键。ID
,其中CarComments
是ResponseTo
的外键。Cars
。 缺点:结构重复,希望显示所有用户的评论时需要ID
查询。UNION
表中添加两列,将Comments
的外键添加到FruitID
。Fruits
,将ID
的外键添加到CarID
。Cars
,其中之一必须始终为ID
才能使数据正确。 缺点:同样,NULL
子句更加复杂,因为它取决于列值,可能会存储不一致的数据,这是因为要限制将其中一列存储的数据限制为{{1} }在MySQL引擎中。就这些而言,个人而言,数字3对我来说似乎是最合理的。
但是有更好的方法吗?