这一次,我发现自己在想出一个好的问题标题方面完全不知所措。
考虑以下三个表。每个都有额外的列,但只提到与表之间的关系相关的列:
- 表
a
有一个主键a_id
- 表
b
有一个主键b_id
和一个a_id
外键列a
(一对多关系) - 表
reference
有一个主键ref_id
reference
是被引用以证实其他 2 个表格中包含的信息的来源列表。因此,我需要表格将它们关联在一起。和都a
与b
具有多对多关系reference
,但还有一个额外的复杂问题:脚注编号。a
这个脚注编号对于each and pair必须是唯一的reference
,但只有当ab
和same之间reference
存在关系时才需要它。(当然,那b
必须与同一个有关a
。)到目前为止,我想出的表示这种关系的最好方法是一对表:
bridge_a_reference
:
- 列:
a_id
,ref_id
,footnote_num
(可为空) - 主键:
a_id
,ref_id
- 外键:
a_id
到表a
;ref_id
表reference
bridge_b_reference
:
- 列:
b_id
,a_id
,ref_id
- 主键:
b_id
,ref_id
- 外键:
b_id
,a_id
到表b
;a_id
,ref_id
到表bridge_a_reference
这样可以保证数据的一致性。如果和之间存在对应关系并且与正确相关,则只有b
和之间存在关系。它还确保脚注编号对于所有/对都是一致的。但是,它是多余的,第二次存储和之间的关系(尽管至少强制保持一致),并且不能确保/关系需要脚注编号。reference
a
reference
b
a
a
reference
a
b
b
reference
我试过几次重新排列我脑海中的表格,但我能想到的其他一切都允许某种不一致(b
对于reference
没有对应a
关系reference
或/b
对a
的关系或不一致的脚注编号的关系。)我怎样才能更好构建我的桥接表以消除冗余并确保脚注要求?有可能吗?a
reference
这是一个建议,因此您可以以声明方式强制执行您想要的约束。(我稍微简化了表名,删除了
bridge_
前缀。)我们删除
footnote_num
:我们添加这个表 - 它基本上只存储那些
a_ref
带有脚注的行,那些你想添加子项的行b_ref
:a_ref_with_footnote
最后,除了现在引用中间表 ( )的外键外,第三个表与您的设计保持一致: