【问题标题】: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 || '%';