MYSQL. Категории - лучше одна таблица с чайлдами и парентами или несколько таблиц?

12
M
На сайте с 20.08.2004
Offline
376
2054

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

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

В настояшее время не могу однозначно определится что лучше и с чем удобней работать, на примере таблиц с категориями.

например вот такая структура

уровень1

- уровевень1.1

-- уровевень1.1.1

-- уровевень1.1.2

-- уровевень1.1.3

- уровевень1.2

-- уровевень1.2.1

- уровевень1.3

уровень2

- уровевень2.1

- уровевень2.2

-- уровевень2.2.1

уровень3

- уровевень3.1

- уровевень3.2

Количество уровней ограничено, скажем 3.

Спасибо.

Miracle добавил 27.10.2010 в 12:43

И дополнительны вопрос: можно ли сделать выборку категорий с названиями для уровня 1,2,3 одним запросом. Если да то как?

отец сыночка, лапочки дочки и еще одного сыночка
edogs software
На сайте с 15.12.2005
Offline
775
#1

Есть такая тема как materialized path. Это когда при использовании child/parent так же вводится чаровое поле, в котором хранится вся последовательность категорий вверх в виде 1/5/8, а так же иногда непосредственные дети в виде 3,6,10,2. При индексированности этого поля поиск получается очень быстрый любой степени точности. Просто тупо like-ом select cat from table where MP like '1/5%' - выберет все в 1/5 категории.

В Вашем случае, учитывая вложенность 3, есть еще более быстрый и разумный подход чем 1/5/8 чаровое поле, это создать 3 поля вида root subroot childofroot ну и так далее если нужна более глубокая вложенность. Затраты на хранение минимальны, будет небольшой гимор при апдейтах конечно (крошечный на самом деле по сравнению с нестед сетс допустим тем же), а скорость и простота выборок Вас приятно удивит (просто выборка вида select cat from table where `subroot`=5 выберет все в 5 категории).

Опять же, в отличии от прямого подхода child/parent тут в бонусах меньший риск зацикливания, когда потом в Ваш код полезет школолопрограммер:)

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

как всегда спасибо за ответ.

надо будет теперь понять что вы написали :)

Miracle добавил 28.10.2010 в 10:35

всему поверил на слово (особенно вам), почти все понял,

вот тут правда не догнал

edogs:
крошечный на самом деле по сравнению с нестед сетс допустим тем же

еще раз спасибо.

Miracle добавил 28.10.2010 в 10:38

edogs:
В Вашем случае, учитывая вложенность 3, есть еще более быстрый и разумный подход чем 1/5/8 чаровое поле, это создать 3 поля вида root subroot childofroot

и тут , наверное, все же если вложенность 3 тогда нужно два поля?

потому что будет обращение к root от subroot и к subroot от subsubroot :)

topy
На сайте с 28.03.2006
Offline
142
#3
Новости коротко и ясно (https://subnews.ru)
M
На сайте с 20.08.2004
Offline
376
#4

спасибо но задачи немного разные.

да и меня больше интересовал вопрос, что лучше отдельные 3и таблицы с категориями, или все же система парент\чайлд.

_savit
На сайте с 19.03.2006
Offline
135
#5

я бы хранил все в одной таблице

id,

name,

parent_id

level

https://vk-botovod.ru - комбайн ВКонтакте, мультимессенджер, эмулятор жизни аккаунтов
M
На сайте с 20.08.2004
Offline
376
#6

аргументируйте пожалуйста.

_savit
На сайте с 19.03.2006
Offline
135
#7

1. простота реализации

2. неограниченная вложенность

3. легко модифицировать

3. при необходимости в ту же таблицу можно добавить материализованный путь (materialized path) или левые и правые значения Nested Sets

4. удовлетворяет описанным вами задачам (выборку категорий с названиями для уровня 1,2,3 одним запросом)

M
На сайте с 20.08.2004
Offline
376
#8

спасибо

А можно одним запросом выбрать все элементы от нижнего чайлда до рута?

_savit
На сайте с 19.03.2006
Offline
135
#9

да, построить путь можно одним запросом ... надо джойнить таблицу саму с собой level раз

topy
На сайте с 28.03.2006
Offline
142
#10

Вообще, не очень кошерно держать много таблиц... Конечно речь идет о сотнях, но все равно стоит придерживаться этого правила.

Я делал на одной таблице, ИМХО так логичнее.

12

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