数据建模引用相同主键的两个外键

时间:2012-07-05 19:40:33

标签: database data-modeling

如果我在另一个表中引用相同主键的表中有两个外键,这是什么类型的关系?一对多?或一对一?

例如:

表作者具有主键AUTHOR_ID

Table Book有两个外键PRIMARY_AUTHOR_ID和SECONDARY_AUTHOR_ID都引用AUTHOR_ID

这是什么类型的关系?

*我知道作者书的例子可以更好的方式处理,我只是用这些字段作为例子。

1 个答案:

答案 0 :(得分:2)

看起来你在一本书和它的作者之间设置了1 ... [1-2]的关系。换句话说,Book与主要作者之间存在1..1关系,并且您实际上在Book和次要作者之间存在1 .. [0-1]关系。有人可能会争辩说,因此你在一本书和它的作者之间有一个...... [1-2]的关系。

这只考虑了方程式的一个方向,因为显然作者也可以有多本书,所以真正的关系更像是N .. [1-2]书籍(复数)和作者之间,取决于使用的符号和方法。

我意识到你刚刚设计了一个例子,以便你可以提出这个问题。关于这个结构的使用,我主张你应该考虑N..M关系的更一般的构造(书籍和它的作者之间。从设计的角度来看,有一件事你不想要do是将过多的业务逻辑硬编码到您的结构表示中。初始业务规则通常建议您具有有限的(1..1或1..N)关系以及后来的业务需求(巧妙或可能不是这样)巧妙地改变,现在你需要能够模拟N..M。这意味着一个架构改变,这当然是可能的,但在某些情况下可以预见到可以避免,你可以选择不那么脆弱。(这是另一种说法是,过早优化是万恶之源。)

你可能已经知道这个,虽然可能是为了其他人的利益,但是要去N..M,你要从BOOKS表中删除两个外键,并引入第三个表:BOOKS_AUTHORS,这将有一个外国的表BOOKS(BOOK_ID)的关键,另一个是AUTHORS(AUTHOR_ID)。您还可以添加一列来指定作者顺序,对作者进行排序,包括主要,次要,第三等......

(注意:我倾向于使用复数命名表,例如BOOKS,因为表是一个集合,而Book是一行作为BOOKS表的成员。当然,从OOP,你倾向于命名一个使用单数的类,例如BOOK,一本书是BOOK类的一个实例 - 主要是术语。)