【问题标题】:how to save a tree structure on DB如何在数据库中保存树结构
【发布时间】:2014-09-22 15:52:08
【问题描述】:

我的数据有章节和子章节和项目 任何项目都需要在章节或子章节下。 章节可以分为多个级别(章节 -> 子章节 -> 子子章节 ...)。

每个章节都有一个编号,我需要显示每个项目和章节的路径。

example :
---------------------
01 - chapter 1
01.0001 - item 1
01.001 - sub chapter 1
01.001.0001 - item 1
01.001.0002 - item 2
01.002 - sub chapter 2
01.003 - sub chapter 3
01.003.0001 - item 1

我认为将章节保存在一个表中,将项目保存在另一个表中,因为项目具有另一个属性(价格、类型...)

任何章节都会有父 ID。

有什么想法吗?

【问题讨论】:

标签: sql-server database architecture


【解决方案1】:

在数据库系统中存储树结构并非易事。通常首先想到的是 ParentId。如果您的级别数量很少且固定,则此解决方案是可以的。问题是为这种类型的表编写查询并不是那么简单。您必须使查询递归(对于动态级别数),或者您必须编写多个连接(对于固定级别数)。我建议使用 varchar Path 列而不是 ParentId 列。让我们看看例子:

CREATE TABLE Chapters (    
   ID PRIMARY KEY,    
   Path VARCHAR(1000),     
   Title VARCHAR(255) NOT NULL          
);

数据示例:

| Id         | Path        | Title           |
|------------|-------------|-----------------|
| 1          |     1/      | Chapter 1       | 
| 2          |     1/2/    | Chapter 1.1     |
| 3          |     1/2/3   | Chapter 1.1.1   |
| 4          |     1/4/    | Chapter 1.2     |
| 5          |     1/4/5   | Chapter 1.2.1   |
| 6          |     1/4/5/6 | Chapter 1.2.1.1 |

然后查询第一章的所有后代写:

SELECT *
FROM Chapters AS c
WHERE c.Path LIKE '1/' || '%';

要选择第 1.1.1 章的所有祖先,请编写:

SELECT *
FROM Chapters AS c
WHERE '1/2/3/' LIKE c.Path || '%';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2010-10-30
    • 2023-03-14
    • 2011-10-05
    相关资源
    最近更新 更多