首页 > 解决方案 > 如何有效地将动态文本保存到数据库中?

问题描述

我有这种文本并想将其保存到数据库:

I. Master Text I                                            <<<Parent
   I.A. Sub Master Text I                                   <<<Child
      I.A.1.  Sub Sub Master Text I                         <<<Child Child                    
         I.A.1.a Sub Sub Sub Master Text I - Row 1          <<<Child Child Child 1
         I.A.1.b Sub Sub Sub Master Text I - Row 2          <<<Child Child Child 2
         I.A.1.c Sub Sub Sub Master Text I - Row 3          <<<Child Child Child 3

II. Master Text II
   II.A. Sub Master Text II
      II.A.1.  Sub Sub Master Text II
         II.A.1.a Sub Sub Sub Master Text II - Row 1
      II.A.2.  Sub Sub Master Text II
         II.A.2.a Sub Sub Sub Master Text II - Row 1
         II.A.2.b Sub Sub Sub Master Text II - Row 2

III. Master Text III
   III.A. Sub Master Text III
      III.A.1.  Sub Sub Master Text III
         III.A.1.a Sub Sub Sub Master Text III - Row 1
         III.A.1.b Sub Sub Sub Master Text III - Row 2
         III.A.1.c Sub Sub Sub Master Text III - Row 3
   III.B. Sub Master Text III

如何有效地保存这些文本?总是有一个Parent,但数量Child是非常动态的。child我无法预测会有多少。

我目前使用的是传统的Master TableDetail Table但我必须定义第一个的数量Detail Table。因此,对于这种文本来说,它是不可靠的。

我的主要问题是,如何将这些文本(带有 n 个子项)有效地保存到数据库中并像示例中一样轻松显示?

标签: mysqldatabase-design

解决方案


这是“分层数据”主题。我建议您查看这个精彩的演示文稿并选择最适合您的方式。

但是 MySql 8 支持递归with子句,所以你可以使用这样的东西:

CREATE TABLE `texts` (
  `id` INT NOT NULL,
  `text` TEXT NULL,
  `parent_id` INT NULL,
  PRIMARY KEY (`id`));

以及选择遵循第一棵树的子项目的示例:

with recursive cte (id, text, parent_id) as (
  select     id,
             text,
             parent_id
  from       texts
  where      parent_id = 1
  union all
  select     p.id,
             p.text,
             p.parent_id
  from       texts p
  inner join cte
          on p.parent_id = cte.id
)
select * from cte;

在这里,您可以找到有关旧版本的 with 子句和类似物的绝佳答案。


推荐阅读