database - 数据建模 : parent and child 'dual' relationship

标签 database database-design relational-database data-modeling

我正在尝试在我的数据模型中创建适当的父/子关系。我在 parent 和 child 之间有一个典型的一对多关系。

我想知道我的 parent 是否了解他们的 child ,是吗

  1. 永远可以接受,并且
  2. 一个好主意

让每个 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
PARENT_ID    // <-- Should this column be here?

,如果从引用父列 parent.PARENT_IDchild.PARENT_ID 添加外键约束,则将强制执行父子关系。

Should table parent_has_children exist?

,像这样的链接或联合表用于模拟多对多 关系。表 PC 之间的多对多关系意味着相同的 C 行可以同时关联多个 P行,反之亦然。这显然不是亲子关系。

为一对多关系建模

如果关系是 1 parent to many children(即同一个 child 只能属于一个 parent ),那么标准的建模方法是通过(其中一个)Parent 的键从 Child 表中引用 Parent 表列,通常是父级的主键 (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/

相关文章:

php - PDO 事务代码警告与 mysqli

php - 如何按日期订购联合请求?

php - 德鲁帕尔 : module update

mysql - 需要设计意见 : Template Databases/Tables for users

sql - 我应该使用 EAV 数据库设计模型还是大量表格

mysql - 如何建立数据库与数据库之间的关系?

database - Oracle 中的约束/外键信息

database - 在以不同点头的容器形式运行的数据库镜像的不同实例中,如何实现数据同步?

mysql - 历史/审计表的设计建议

python - 避免在 Python Flask 和大多数其他语言中使用魔数(Magic Number)