可能是我最初的设计有缺陷,但让我们从那里开始,看看是否有足够好的方法。
比如说,我有两个实体,A
它们B
非常相似但不相同,因此列集是不同的。由于这些原因,有两个不同的表,A
并且B
.
也就是说,我想创建另一个表,该表应该同时描述A
和B
使用一组适用于两者的字段A
和B
。我们称这张桌子为entity_settings
。
它的模式并不直观:
我的第一个想法是使用某种
entity_type
标志,并entity_id
从 A 或 B 中使用,具体取决于具有 UNIQUE 约束的类型(entity_type, entity_id)
。这样的定义使得不可能有一个正常的外部约束,因为它entity_id
由来自两个表的 id 组成。另一种选择是拥有
A_id
并且B_id
可以为空,但引用相应表中的 ID 字段。这是有道理的并且提供了参照完整性,但是插入到这个表中会很笨拙。我也在考虑的唯一选择是有两个单独的表
A
,B
以便每个表都有自己的子表。这在表的数量方面看起来有点浪费,但在设计方面可能是最干净的选择。
几乎与往常一样,我有一种感觉,我缺少一些东西,如果有人可以提出任何其他选择,我将不胜感激。
编辑:
在第二个选项中,添加 CHECK 约束也很有意义,例如CHECK((A_id IS NOT NULL AND B_id IS NULL)) OR (A_id IS NULL AND B IS NOT NULL))
您没有遗漏任何东西,这是关系数据库中已知的棘手问题。这个概念自然不适用于这样的模型。
您的解决方案 2. 是一个很好的解决方案,带有检查约束。
解决方案3.也是可能的。也许您可以使用分区,这样您就可以拥有一个分区表,并且分区具有指向and
entity_settings
的外键。如果这不会导致您的查询或系统的其他部分出现问题,那么这是一个不错的解决方案。A
B