我正在尝试在我的数据模型中创建正确的父/子关系。我和父母之间存在典型的一对多关系。
我想知道我是否有父母知道他们的孩子,是吗
让每个孩子专门了解其父母? (在我的情况下,孩子只能有一个父母)
parent
-------------
PARENT_ID
OTHER_COL
...
child
-------------
CHILD_ID
PARENT_ID // <-- Should this column be here?
OTHER_COL
...
parent_has_children
--------------------
PARENT_ID
CHILD_ID
我看到在子项中包含父列的优点是可以轻松地从子项中检索父项。但是,这只是懒惰的设计吗?
提前致谢。
答案 0 :(得分:4)
<强> TL; DR 强>
回答问题:
child
PARENT_ID // <-- Should this column be here?
是,如果从引用父列child.PARENT_ID
的{{1}}添加外键约束,则将强制执行父子关系的完整性。
表格
parent.PARENT_ID
是否存在?
否,这样的链接或联合表用于建模parent_has_children
关系。表many-many
和P
之间的多对多关系意味着同一C
行可以同时关联多个C
行,反之亦然。这显然不是亲子关系。
对1对多关系进行建模
如果关系是多个子节点的父节点(即同一个子节点只能属于一个父节点),那么标准建模方法是通过父节键中的一个引用子表中的父表。列,通常是Parent的主键(PK)。同时,对参考列(P
)的外键(FK)约束也是一个好主意,以鼓励RDMBS在整个关系中强制执行referential integrity:
child.PARENT_ID
OP的额外多个:许多表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)
是多余的,因为每parent_has_children
只有一行,并且很快就会成为使这个表child
保持行的负担从其他表中添加/删除(因为未能保持同步将导致关系完整性的混乱/矛盾)。
回复:父母如何了解自己的孩子?
可以使用在父外键列上筛选的子表上的简单查询找到给定父级的子记录:
in sync
由于这通常是一个常见的查询,因此确保将外键SELECT ...
FROM child
WHERE PARENT_ID = myParentId;
编入索引始终是一个好主意 - 默认情况下,某些RDBMS版本会对所有外键执行此操作。
child.PARENT_ID
如果在表示这些表的应用程序中有实体模型(例如,对于ORM),则父实体通常具有包含其CREATE INDEX IXFoo on child(PARENT_ID);
实例的集合,并且在子实体上具有标量外键{ {1}}'column'要么完全删除,要么替换为对父实例的引用:
child
答案 1 :(得分:1)
如果关系真正是一对多而不是多对多,那么您可以将PARENT_ID
作为外键放在CHILD
表上并删除PARENT_HAS_CHILDREN
表共
答案 2 :(得分:1)
我倾向于废弃parent_has_children表,而只是在子节点上有一个PARENT_ID - 这是表示这些数据的更传统方式。