MySQL деревовидные таблицы (не большая заметка)

12
rtyug
На сайте с 13.05.2009
Offline
263
1465

сейчас думаю над архитектурой еще одного дерева...

мне показалось что NestedSet не подойдет для него так как NestedSet все операции кроме SELECT ресурсоемкие!!

недостатки в Nested Set: если вы заметили, точно такая же рекурсия, только там идет UPDATE ресурсоемкий который все дерево изменяет (очень много записей) по этому я нашел решение где-то на opennet.ru на innodb с ускорением за счет внешних ключей и транзакции (чтобы дерево не развалилось во время изменение структуры). НО еще говорят что если innodb с большой базой, то грузит сильно сервер, неоднократно сталиквался, но в приципе мне все равно, тут не знаю... на выбор

про мое дерево долго рассказывать:

1)

щас нарисую

"Корень дерева" --> "разедел1"

````````````````` "разедел2"->>>"разедел1"

````````````````` "разедел3"````"разедел2"

````````````````` "разедел4"````"разедел3"->>>>>>"разедел1"

````````````````` "разедел5"````````````````````"разедел2"

````````````````` "разедел6"````````````````````"разедел3"

```````````````````````````````````````````````"разедел4"

из этого:

а) у кадого раздела может быть свой "подраздел(ы)"

б) у кадого раздела может быть "тема(ы) сообщения" как на этом форуме

б2) у темы есть коментарии

думаю все понятно?

2) нужно сделать:

перенос узла,

выборка всех родителей вверх,

просмотр

вывести дерево начиная от како-то элемента,

удаление/изменение атрибутов всего дерева со всеми подчиненными узлами

если ничего не забыл, может еще что-то

все дерево выносить не надо

===

при обычном parent_id:

id

parent_id

(можно еще level)

Преимущества дерева

1) перенос

2) Добавление

3) Нормальный SELECT и SELECT всех родителей (SELECT сразe 50-100 ступеней можно сделать,( т.е. ограничить) а лишние удалить, либо рекурсию) все остальное нормально

Недостатки:

1) удаление всего дерева затруднительно (рекурсию надо делать, или процедуру)

НО в условии, например присутствует, что пользователи не могут когда они захотят все удалить, литит удлаения должен быть (проблем не будет)

2) узменение атрибута узла и всего поддерева (например надо все дерево скрыть начиная с конкретного узла) (рекурсию надо делать, или триггер)

можно записывать level уровень, чтобы сделать еше быстрый SELECT всех родителей и в один НОРМАЛЬНЫЙ запрос

т.е. исходя их этого например при обычном NestedSET, пвсе запросы (почти все, удаление, добавление, перенос) ресурсоемкое, но кроме SELECT

в этом случае который я привел, грубо говоря, только удаление ресурсоемкое!

вообщем, как?

писал старался, хотел узнать может есть замечания какие-то?

Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
[Удален]
#1

я за нестед

bearman добавил 04.10.2009 в 18:48

в дереве хранить только каталоги и подкаталоги, а комментарии и посты в других таблицах. если я правильно понял то это тоже частью вопроса было)

rtyug
На сайте с 13.05.2009
Offline
263
#2

за обычный, не за тот который с 2 таблицам и на innodb?

а условия такие были или другие?

в принципе все равно

NZ
На сайте с 20.09.2009
Offline
12
#3

Однозначно нестед!

edogs software
На сайте с 15.12.2005
Offline
775
#4

При относительно небольшом количестве категорий, есть смысл использовать то, что сейчас модно называть materialized path.

Грубо говоря второй вариант + одно поле в котором будет 1|3|4|5| дерево вышестоящих категорий.

Благодаря такому доп.полю многие операции становятся предельно простыми, а на небольших объемах тормозов не будет... а очень даже может будет и ускорение.

До 1000 категорий имхо оптимальный способ.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
rtyug
На сайте с 13.05.2009
Offline
263
#5

я вот как раз хотел оптимизировать DELETE

Есть таблица составных деталей с "древесной" структурой, т.е. код/код предка/название, например:


CREATE tree (i, parent_id i, name c(10))
INSERT INTO tree VALUES (1,0,'Деталь1')
INSERT INTO tree VALUES (2,0,'Деталь2')
INSERT INTO tree VALUES (3,2,'Деталь3')
INSERT INTO tree VALUES (4,2,'Деталь4')
INSERT INTO tree VALUES (5,4,'Деталь5')
INSERT INTO tree VALUES (6,4,'Деталь6')
INSERT INTO tree VALUES (7,5,'Деталь7')

Как в такой таблице красиво сделать рекурсивное удаление всех потомков при удалении записи (чтобы при удалении детали №4 удалились детали №5,6,7)? И можно ли это сделать через ХП?

вот я это нашел... http://forum.foxclub.ru/read.php?29,400359,400507

например на Visual Foxpro:


DelTree (2)

PROCEDURE DelTree (tnID)
LOCAL laChilds[1], ln1
SELECT det_id FROM tree WHERE parent_id = m.tnID INTO ARRAY laChilds
FOR ln1 = 1 TO _TALLY
DelTree (laChilds[m.ln1])
ENDFOR
DELETE FROM tree WHERE det_id = m.tnID
ENDPROC

но как написать это на MySQL, например, на триггерах или процедурах?

не могу понять как это сделать вообще, путаюсь...

[Удален]
#6

rtyug, используйте нестед или materialized paths(о чем я не стал упоминать, думая что людей слышавших про это здесь нет), ваша структура положит нахрен таблицы 100% еще больше чем нестед.

rtyug
На сайте с 13.05.2009
Offline
263
#7

спасибо, использую, но для этого случая решил сделать проще, так как не нужны все возможности нестед...

я DELETE сделал на дополнительной временной таблице, просто не срочно надо, думал что кто-то поможет оптимизировать, я этого не понимаю...

====

что именно положит?

если нужно вывести всех родителей вверх, но поможет level очень просто красивый запрос, или в процедуре, или в триггре в цикле, все остальные запросы в 1-2 строки...

только DELETE очень не нравиться

для моего случая все дерево выводить не надо, т.к. оно не ограниченное

[Удален]
#8

materialized paths попробуйте, может понравится

Dreammaker
На сайте с 20.04.2006
Offline
569
#9
bearman:
о чем я не стал упоминать, думая что людей слышавших про это здесь нет

Вы такого плохого мнения о всех программерах на SE? :)

[Удален]
#10
Dreammaker:
Вы такого плохого мнения о всех программерах на SE? :)

я привык к глобальной тупости, жизнь научила. серч тут не причем + от общей картины на серче можно подумать что тут одни "не в теме" люди.

Тупицы.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий