2016-03-05 42 views
-1

如何设计我的表在以下情况?如何设计数据库表(或休眠实体)

我有一个实体可以有多个实体,这是直接的。现在我有另外一个实体外部引用这与两者都有关,这意味着父母可以有多个外部引用和孩子也可以有自己的多个外部引用。我应该如何设计外部引用的表格,我应该将所有表格都保存在一张表中,还是要为父级别引用创建两个单独的表格,并为子级别引用创建两个单独的表格。

第一种方法通过保持在同一个表中的所有引用:

Parent - Parent_Id, other fields... 
Child - Child_Id, Parent_Id (Foreign key to parent), other fields... 
External Reference - Ref_Id, Parent_Id, Child_Id, other fields 

但child_id可以为null父级外部参考因此不能使它的外键。我必须在我的代码中维护该外键而不是DB约束。

第二条本办法由保持在单独的表引用:

Parent - Parent_Id, other fields... 
Child - Child_Id, Parent_Id (Foreign key to parent), other fields... 
Parent External Reference - Ref_Id, Parent_Id, other fields 
Child External Reference - Ref_Id, Child_Id, other fields 

如果用户需要引用的两个水平,那么必须寻找到两个表。

什么是最好的方式来实现这一点,所以我可以保留所有引用在一个地方,也建立他们之间的FK关系。

+0

通常,父外部引用和子外部引用中存在足够的差异,它们应该是两个单独的表。但是,您的具体需求可能会有所不同。 –

回答

0

你的困境是一个教科书的例子,你应该使用association with a join table(我们可以称之为第三种方法:),但它应该是第一个)。

这样你就不会有一个实体的两个表,也不会有你提到的外键问题。在更多实体与ExternalReference关联的情况下,考虑您的两种方法。连接表是最有前途的证明,并在您的情况下可扩展的方法