【问题标题】:Create a table/tables with with parent/child hierarchy in SQL在 SQL 中创建具有父/子层次结构的表/表
【发布时间】:2021-03-11 16:17:55
【问题描述】:

我目前是一名自学成才的程序员,我了解并使用过 noSQL 数据库。 现在我想更好地学习关系数据库。我正在为自己做一个项目,并试图在这里加深我的知识,我有点困惑。我的目标是创建一个具有子/父层次结构的简单数据库。我想为人员创建一个数据库,在其中我只能访问识别号(没有姓名、年龄或其他)。这个人可以有孩子或父母或两者兼而有之。如何建议我构建这个。我想查询该表,以便检索某个人的所有孩子和父母。我的第一个想法是建立一个只有 PK(Id_Number) 的表和其他具有复合键(FK->Id_Number 和 Id_parent) 的表,但我认为它不会像这样工作?我该怎么做?你对此有什么想法吗?谢谢!

为了帮助可视化(而不是识别号,让我们使用名称),我有这个对象,我应该如何存储它?

 {
  human: "Joe",
  child: [
    {
      human: "Kevin",
      child: [
        {
          human: "Joaquin",
        },
        {
          human: "leticia",
        },
      ],
    },
    {
      human: "Mary",
      child: [
        {
          human: "Joaquin",
          child: [{ human: "levi" }],
        },
        {
          human: "leticia",
        },
      ],
    },
  ],
};

目标是了解所有家庭层次结构,例如谁是 kevin 的儿子、父母和可能的兄弟。

【问题讨论】:

  • 具有子/父层次结构的数据库。 父母怎么可能有孩子?
  • 一个孩子可以有多个父母,一个父母可以有多个孩子
  • 如果是这样,那么关系不是父子关系。具有外部限制的多对多是常见的(不允许使用环)。当然,你可以把它当成亲子,但这实际上是不正确的。
  • 您的样本中有多个父母吗? PS。仅发布有效的 JSON。
  • Akina 已经更新了,谢谢!

标签: mysql sql database hierarchy


【解决方案1】:

对实体之间的父关系建模的最简单方法是使用一个表作为实体(图中的节点),使用另一个表作为关系(图中节点之间的弧线)。

例如:

create table person (
  id int primary key not null,
  identification_number varchar(50) not null
);

create table parent_child_relationship (
  parent_id int not null references person (id),
  child_id int not null references person (id),
  primary key (parent_id, child_id),
);

您也可以使用单个表,但将关系与实体分开可以让您灵活地考虑拥有多个父母(自然、合法、收养等)的人,并考虑生活变化。

【讨论】:

  • 从另一方面看,这种结构允许约束逻辑无法检测到的循环......
  • 确实是一个好的开始,谢谢!但这似乎没有针对我的用例进行优化,因为我希望在单个查询中某个人的所有关系(父母、孩子和兄弟姐妹),这样我只能获得某个 parent_id 的孩子或父母某个 child_id 的,我想要一个标识号的 3 个关系。
  • @hiun 关系数据库可以通过单个查询遍历整个图,并根据需要返回有限或无限数量的级别。你可能需要用一个具体的例子来缩小你的问题范围。
  • @TheImpaler 是的,我一直在尝试和测试,你是对的,我可以按照你的回答,它适合我的需要,非常感谢你!
猜你喜欢
  • 2022-01-27
  • 2016-02-27
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2021-10-22
相关资源
最近更新 更多