我有一个包含许多不同实体的数据库,我需要一种灵活的方式来表示实体之间的引用,而无需创建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表?