我有一种情况,一个特定的子对象可能有多个不同类型的父对象。例如,一个对象foo
可能是一个或多个对象的子对象。此外,我还有一个对象,它也可能是一个或多个, , 或对象的子对象。在 SQL 中对此建模的正确方法是什么?a
b
c
bar
a
b
c
A)所有关系的单个表:
relationship_tbl
parent_id parent_type child_id child_type
--------- ----------- -------- ----------
1 a 5 foo
2 a 6 foo
3 c 7 bar
4 b 7 bar
B)每个父类型的唯一表:
a_child_tbl
parent_id child_id child_type
--------- -------- ----------
1 5 foo
2 6 foo
b_child_tbl
parent_id child_id child_type
--------- -------- ----------
4 7 bar
c_child_tbl
parent_id child_id child_type
--------- -------- ----------
3 7 bar
C) 每个子类型的唯一表:
foo_parent_tbl
child_id parent_id parent_type
--------- ----------- -----------
5 1 a
6 2 a
bar_parent_tbl
child_id parent_id parent_type
--------- ----------- -----------
7 3 c
7 4 b
D) 每个组合的唯一表
a_foo_tbl
parent_id child_id
--------- --------
1 5
2 6
b_bar_tbl
parent_id child_id
--------- --------
4 7
c_bar_tbl
parent_id child_id
--------- --------
3 7
E) 其他一些我没有探索过的策略
对我来说,似乎 A 是最容易查询和回答Find all the parents of child 7
or之类的问题Find all the children of parent 4
,但我读过一些建议,基本上说永远不要为父/子关系创建通用表。
有人可以阐明执行此操作的最佳方法吗?为什么?可以安全地假设该表中的行数永远不会超过几百万行。