2014-09-21 2 views
1

В моих данных есть главы и подглавы и пункты , если любой предмет должен находиться под главой или подразделением. главы могут быть на многих уровнях (глава -> глава -> подпункт главы ...).как сохранить древовидную структуру на DB

В каждой главе есть число, и мне нужно показать путь для каждого элемента и главы.

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 

я думаю, чтобы спасти главу в одной таблице и элементы в другой, потому что детали имеют еще свойства (цена, тип ...)

любой раздел будет иметь идентификатор родительского.

любые мысли?

+0

[Получить путь к узлу в дереве] (http: // stack overflow.com/questions/16295183/get-path-of-node-in-tree) – bummi

ответ

1

Хранение древовидных структур в системах БД - это не тривиальная задача. Первое, что обычно приходит в голову, - это ParentId. Это решение в порядке, если у вас небольшое и фиксированное количество уровней. Проблема состоит в том, что не так просто написать запрос для этого типа таблицы. Вы должны сделать запрос рекурсивным (для динамического количества уровней) или вам нужно написать несколько объединений (для фиксированного количества уровней). Я бы рекомендовал использовать столбец Path varchar вместо столбца 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 || '%'; 
Смежные вопросы