用于嵌套数据的表结构是什么?

时间:2012-08-03 05:58:57

标签: mysql sql database database-design

好的,所以我正在开发一个带有分层数据的项目,我正在使用这样的书写应用程序:

  • 顶级父母(法案) - 包含法案名称,职位(第一法案),描述和文本(介绍文本)
  • 中级父/子(章) - 包含章节名称,位置(第一章),描述和文字(介绍文字)
  • 底层(部分) - 包含部分名称,位置(第一部分),描述和文本(实际内容文本)

现在,我希望有一个可变数量的级别(例如包含将具有全文的子部分),但我不完全确定如何有效地创建这样的表。我最初的想法是让它们通过parentId连接,顶级为parentId为null。

例如,如果我想在第一个位置调用顶级父级,那么这不是什么大问题。现在,我可以搜索空的父字段和1的位置。 要调用“章节”(中级),我会做同样的事情,但得到结果的id并将其用作parentid。

问题在于部分,我必须有几个子查询才能获得最终结果。如果我想要可变数量的级别,我需要大量的子查询,这将是性能损失。

我看到了similar question,但我并不真正理解答案或我如何使用它。

我已经考虑过某种分类表或将所有父母ID带到孩子身上(即,一个部分将在parentid下列出章节和行为ID)但我没有设置它。 Feedbooks.com在提交图书时使用了类似的层次结构但是他们没有将数据存储在数据库中,他们只需要输入并将其转换为输出(pdf,epub或其他)。

哦,我打算在MySQL中构建它。

想法?

修改 想象这种情况的一种更简单的方法是与一个家庭。假设你有3个祖父(比尔,伯纳德,波恩),他们之间有5个孩子(约翰,乔伊,约什,杰里米,杰克逊),他们又拥有自己的两个孩子(例如:唐纳德,杜伊,甄子丹)。而且,假设数据库不存储这种关系,而是关系到孩子住在哪里,我们不关心这里的生物学。

所以,让我们说Donnie最初和John一起住在Bill身边。唐尼是约翰的第一个孩子,约翰是比尔的第二个孩子。你如何质疑比尔的第二个儿子的第一个孙子?

让我们说他们四处走动,现在唐纳德正和约翰呆在一起。唐纳德是约翰的第二个孩子(第一个孩子的位置充满了别人),约翰仍然是比尔的第二个孩子。你如何质问比尔的第二个儿子的第二个孙子?

如果John带着他所有的孩子搬到Boe的家里怎么办? Boe是第二位祖父。你现在如何查询这些信息?你会如何存储这类信息?

如果你现在把曾孙子混在一起怎么办?

1 个答案:

答案 0 :(得分:1)

这是使用闭包表的一个很好的例子,就像你引用的答案一样。您可能需要查看herehere

从第一个链接引用:

  

Closure Table是一种用于表示关系中树的设计   数据库通过存储树节点之间的所有路径。