Сохранение древовидной структуры в БД

crocodile2u

http://vbolshov.org.ru
Тогда опиши свою конкретную задачу, а не давай "похожий" пример. Решение найдется.
 

azamat

Guest
Конкретная задача, возможны 2 варианта каталога (пока 2 неизвестно что еще придет в голову заказчику ):

1. all->brand->product sort->product category->product target->product line->product name list

Все подкатегории со 3 по предпоследнюю могут выпадать.

2. all->product sort->product type->brand->product name list

Каким образом это лучше всего реализовать.
Я думаю, что лучше всего все эти:

product sort
product category
product target
product line
brand
product type

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

Ну а 2 различных каталога получится благодаря разным маршрутам следования по этим полям.

Вот так. Маразм?:)
 

crocodile2u

http://vbolshov.org.ru
так, начинает проясняться.

для уточнения:
какие атрибуты могут быть у категории, таргета, линии? (это может оказаться важным)
 

azamat

Guest
какие атрибуты могут быть у категории, таргета, линии? (это может оказаться важным)
Ну пока это просто название и какая-то дополнительная информация (описание), так сказано в спецификации ,причем все это с поддержкой многоязычности так что скорее всего эти атрибуты также будут ссылками на какие-то другие таблицы, т.е.:

Например Line:

id_line | name_line_en | name_line_fr | name_line_ru |
desc_line_en | desc_line_fr | desc_line_ru

Пока я вижу это так. Жду еще вопросов и советов.
 

crocodile2u

http://vbolshov.org.ru
Тогда - я бы делал приблизительно так, как посоветовал IL78. Пусть будет дерево категорий/товаров, и у каждого из них привязка к бренду, типу, чему-то там еще.

Дело в том, что отдельные таблицы для категории, таргета и остального - это крайне неудобно. А если еще один уровень вложенности добавится? а если два? Дерево по связи ID-parentID или NestedSet гораздо удобнее.

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

azamat

Guest
Сразу, спасибо.
Но все таки:
Пусть будет дерево категорий/товаров, и у каждого из них привязка к бренду, типу, чему-то там еще.
Не совсем понял, если не сложно поясни еще чуть-чуть.
 

crocodile2u

http://vbolshov.org.ru
ну вроде так:

category:
id | parent_id | name | brand_id (FK) | sort_id (FK)

brand:
brand_id | brand_name

sort:
sort_id | sort_name

Получается, что категория однозначно привязана к бренду и сорту.
 

Vasya

Guest
Исходя из постановки задачи
----
all->brand->categories->type
all->type->categories->brand
----
это, IMHO, вообще никакое не дерево.
Ибо определить заранее парента невозможно. Все эти *свойства* товара (brand, categories, type) одноуровневые и не связаны иерархическими взаимосвязями. Следовательно, в таблице можно так и указать:
id, name, ..., brand, categories, type
Ну, а разные иерархии -- это уже *способ представления* данных, а не формат хранения.

Дерево можно формировать из простого селекта типа такого:

select * from goo
order by brand, categories, type;

Последовательно перебирая уже отсортированную таблицу, можно реагировать на изменение brand, categories или type и создавать новый узел соответствующего уровня. Если есть проблемы со скоростью, то результат разбора можно закешировать. Соответственно, разные результаты разных запросов надо кешировать в разные места... :)
 

azamat

Guest
Vasya, я об этом уже говорил (см. выше), но меня никто не поддержал, ты первый:)

Ну или почти об этом
 

crocodile2u

http://vbolshov.org.ru
azamat, про то, что в твоей задаче, как ты ее поставил изначально, нет дерева, говорилось изначально (см. пост Неко и мои первые посты). Определись, какую задачу тебе нужно решить. Нет дерева - нет проблем. Решение даже подсказали. Есть дерево - ситуация чуть усложняется, но в целом все несложно.
 

azamat

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

crocodile2u

http://vbolshov.org.ru
Про то и речь! Выбирай - что тебе нравится, что больше подходит и что нужнее.
 

neko

tеam neko
неправильно вы ее решаете, свою задачу
верный способ запутаться при малейшем усложнении условий
 
Сверху