类似EAV的变量外键ref_type / ref_id:糟糕的设计?

时间:2010-12-11 22:22:45

标签: sql database-design foreign-keys entity-attribute-value

我有一个包含许多不同实体的数据库,我需要一种灵活的方式来表示实体之间的引用,而无需创建N * M多对多表或添加大量外键列来覆盖每个可能的引用实体。

我正在考虑的一个选项是创建一对列来表示引用,ref_type(string / varchar)和ref_id(int),并以EAV样式使用它们指向任何其他实体。 ref_type将保存引用实体的名称,ref_id将保存实体的id(如外键)。

例如,如果我有我的Foo实体的表并想要引用Bar或Baz实体,它可能看起来像这样:

foo_id  foo_name  ref_type  ref_id
------  --------  --------  ------
1       aaa       bar       352
2       bbb       baz       937
3       ccc       bar       522

我知道更常见的方法是在我的foo表中使用bar_id和baz_id作为专用外键列,或者使用专用的foo_to_baz和foo_to_bar表来表示关系。只有两个可能的引用实体,这些正常选项并不算太糟糕,但如果你有20或200个可能的实体,那么这似乎是不切实际的。

此模式是否具有特定名称?或者它属于实体 - 属性 - 值(EAV)?

这被认为是“糟糕”的数据库设计吗?如果是这样,是否有一些更好的解决方案,不需要很多外键列或X_to_Y表?

0 个答案:

没有答案