我面临一个问题。我必须设计一个数据库模式表结构。通常,我有一个具有一对多关系的小型分层树结构:
A
|-B1
| |-C1
| |-C2
|
|-B2
|-C3
|-C4
现在,从我的角度来看,我有两个选择来设计这个:
对于 A 和 B,我可以创建两个表,而直接通过外键
table_a
引用。table_a
我认为,这可能是更好的方法,因为您将需要更少的查询连接操作。CREATE TABLE table_a ( id int PRIMARY KEY, some_specific_data text ); CREATE TABLE table_b ( id int PRIMARY KEY, some_other_specific_data text, id_parent int REFERENCES table_a(id) );
对于 A 和 BI 可以创建两个独立的表和一个连接两个表的附加关系表(就像我对多对多关系所做的那样)。在这里,两个表都更加独立,我认为这通常是可取的。
CREATE TABLE table_a ( id int PRIMARY KEY, some_specific_data text ); CREATE TABLE table_b ( id int PRIMARY KEY, some_other_specific_data text ); CREATE TABLE a_to_b ( id int PRIMARY KEY, id_a int REFERENCES table_a(id), id_b int REFERENCES table_b(id) );
在我看来,两者都是有效的设计。但是,我无法决定应该选择哪一个。选择选项 1 或选项 2 甚至第三个选项是否有任何论据?
编辑:
更加具体:
A 和 B 不是同一类型。你可以把它想象成:
- A是房子
- B是门
- 所以,房子有很多门
- 一扇门被一所房子所包含
我认为有些困惑在于您如何标记事物。对象 A 和对象 B 与表 A 和表 B 不同,因为正如 bbaird 所指出的,对象 A 和对象 B 是同一个对象(或数据库上下文中的实体)。
根据我对您的问题描述的理解,您可以将您的数据视为实际的父母和孩子,以帮助概念化。父母可以进入一个表,而孩子可以进入一个单独的表,但它们具有足够接近的特征,因为两者都是人,并且可能应该住在同一个主表中。然后,您可以拥有第二个表,该表表示子项与其父项的直接关系。以这种方式考虑之后,您的第一个设计选择更有意义(这是父子关系数据集的一个非常常见的设计选择。)
注意:上述答案是在 OP 更新他的问题之前。请参阅已接受的答案以获取进一步说明。
D |-[0,*]----------[1]-| H
每扇门都属于一所房子;
对于每个房子:不止一扇门可能属于该房子。
D |-[0,*]--------[0,1]-| H
每扇门最多属于一所房子;
对于每个房子:不止一扇门可能属于该房子。
注意:
D |-[1,*]----------[1]-| H
每扇门都属于一所房子;
对于每所房子:至少有一扇门属于那所房子。
不是那么容易实现的。这可能看起来不错:
但是,不可能从模型的其余部分对房屋进行 FK。