mysql - 嵌套数据使用什么表结构?

标签 mysql sql database database-design

好吧,我正在开发一个包含分层数据的项目,我将其用于书籍写作应用程序,如下所示:

  • 顶级父级(Act) - 包含Act名称、位置(第一个Act)、说明和文本(介绍文本)
  • 中级父级/子级(章节)- 包含章节名称、位置(第一章)、说明和文本(简介文本)
  • 底层(部分)- 包含部分名称、位置(第一个部分)、说明和文本(实际内容文本)

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

例如,如果我想在第一个位置调用顶级父级,这没什么大不了的。现在,我可以搜索空父字段和位置 1。 为了调用“章节”(中级),我做了同样的事情,但获取结果的 id 并将其用作父 ID。

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

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

我已经考虑过某种分类表或将所有父 ID 转移到子 ID 中(即,一个部分将在 ParentID 下列出章节和 Act ID),但我还没有确定。 Feedbooks.com 在提交书籍时使用类似的层次结构,但他们不将数据存储在数据库中,他们只是获取输入并将其转换为输出(pdf、epub 或其他)。

哦,我计划在 MySQL 中构建它。

想法?

编辑 想象这种情况的一个更简单的方法是与家人一起。假设您有 3 个祖父(Bill、Bernard、Boe),他们有 5 个 child (John、Joey、Josh、Jeremy、Jackson),而他们又拥有 2 个 child (例如:Donald、Duey、唐尼)。假设数据库不存储这种关系,而是存储哪个 child 住在哪里的关系,而我们不关心这里的生物学。

假设唐尼一开始和约翰住在一起,约翰又和比尔住在一起。唐尼是约翰的第一个 child ,约翰是比尔的第二个 child 。如何查询比尔二儿子的长孙?

假设他们搬走了,现在唐纳德和约翰住在一起。唐纳德是约翰的第二个 child (第一个 child 的位置由其他人填补),约翰仍然是比尔的第二个 child 。如何查询比尔二儿子的二孙子?

如果约翰和他所有的 child 搬到 Boe 家怎么办?鲍是二爷爷。现在如何查询这些信息呢?您将如何存储此类信息?

如果你现在把曾孙也加入进来怎么办?

最佳答案

这是使用闭包表的一个很好的例子,正如您所引用的答案一样。您可能想看一下herehere .

引用第一个链接:

The Closure Table is a design for representing trees in a relational database by storing all the paths between tree nodes.

关于mysql - 嵌套数据使用什么表结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11790108/

相关文章:

mysql - 为什么Mysql使用了错误的索引?

sql - 如何在 VBA 中将整数值传递到 SQL 查询

mysql - sql触发两个表不为空

php - 如何在错误的数据库连接上设置自己的异常?

mysql - 如何从 MySQL 中的日期时间中减去小时数?

syntax - mysql:不喜欢的正确语法是什么?

php - 可以将邮政地址存储为一个文本字段,而不是 street1、street2 等吗?

sql - 如何使用seek pagination获取下一个数据集?

sql - 无组计数

php - 如何检查数据库列中存在的字符串?