我正在尝试在我的数据模型中创建适当的父/子关系。我在 parent 和 child 之间有一种典型的一对多关系。
我想知道我是否有 parent 知道他们的 child ,是吗
让每个 child 都特别了解其 parent ? (在我的情况下,一个 child 只能有一个 parent )
parent
-------------
PARENT_ID
OTHER_COL
...
child
-------------
CHILD_ID
PARENT_ID // <-- Should this column be here?
OTHER_COL
...
parent_has_children
--------------------
PARENT_ID
CHILD_ID
我认为在 child 中有父列的好处是可以轻松地从 child 那里检索 parent 。但是,这只是懒惰的设计吗?
提前致谢。
最佳答案
TL;DR
回复问题:
child
PARENT_ID // <-- Should this column be here?
是 ,如果从引用父列
child.PARENT_ID
的 parent.PARENT_ID
添加外键约束,则将强制执行父子关系的完整性。没有 ,像这样的链接或联合表用于模拟
many-many
关系。 P
和 C
表之间的多对多关系意味着相同的 C
行可以同时关联许多 P
行,反之亦然。这显然不是亲子关系。建模一对多关系
如果关系是 1 个父级到多个子级(即同一个子级只能属于一个父级),那么标准建模方法是通过父级的键列(之一)从子表中引用父表,通常父级的主键 (PK)。同时,在引用列(
child.PARENT_ID
)上设置外键(FK)约束以鼓励 RDMBS 跨关系强制执行 referential integrity 也是一个好主意:parent
-------------
PARENT_ID PRIMARY KEY, // PK for the parent table
OTHER_COL
...
child
-------------
CHILD_ID PRIMARY KEY, // PK for the Child Table
PARENT_ID // <-- Should this column be here? = Yes
CONSTRAINT FK_ChildParent FOREIGN KEY(PARENT_ID) REFERENCES parent(PARENT_ID)
OP 的额外 many:many 表
parent_has_children
是多余的,因为每个 child
将只有一行,并且很快将成为一个负担,将这个表 in sync
与从其他表中添加/删除的行一起保留(因为未能保持同步将导致关系完整性的困惑/矛盾)。Re: parent 如何了解自己的 child ?
可以使用对父外键列过滤的子表的简单查询找到给定父级的子记录:
SELECT ...
FROM child
WHERE PARENT_ID = myParentId;
由于这通常是一个常见的查询,因此确保对外键
child.PARENT_ID
进行索引总是一个好主意——默认情况下,某些 RDBMS 版本会为所有外键执行此操作。CREATE INDEX IXFoo on child(PARENT_ID);
如果在表示这些表的应用程序中有实体模型(例如,对于 ORM),父实体通常会有一个包含其
child
实例的集合,而在子实体上,标量外键 child.PARENT_ID
'column' 要么完全删除,或替换为对父级实例的引用:class Parent
{
ParentId,
Child[] Children,
// ...
}
class Child
{
ChildId,
Parent Parent, // Optional, allows bidirectional navigation
// ...
}
关于database - 数据建模 : parent and child 'dual' relationship,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3383314/