如何在DB上保存树结构

时间:2014-09-21 06:43:50

标签: sql-server database architecture

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

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

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。

任何想法?

1 个答案:

答案 0 :(得分:1)

在DB系统中存储树结构并非易事。通常会出现的第一件事是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 |

然后查询第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 || '%';