Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дерево + внешний ключ / 12 сообщений из 12, страница 1 из 1
13.12.2011, 19:24
    #37573926
andy.s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
Всем здрасте.

Чтобы не объяснять абстрактно, сразу приведу пример:

Есть таблица menu, в которой хранятся разные меню (не ресторанные, а наподобие меню на сайтах). Структура: (id, name).
У каждого меню есть элементы, которые хранятся в таблице menu_items со структурой: (id, menu_id, name).

Но теперь хочется сделать возможность добавлять подпункты меню, т.е. получится дерево. Как его хранить - вопрос риторический, но возьмем для примера самый простой способ, при котором таблица станет вот такой: (id, menu_id, parent_id, name).

Получается, что у каждого подпункта (и под-под-под.. пунктов) будет поле menu_id, что меня несколько смущает. Пытался спросить у гугла, но даже не знаю, как вопрос задать, голова уже плохо работает под вечер :)) Остается только надеяться на помощь и советы форумчан.

Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
13.12.2011, 19:32
    #37573943
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
andy.sОстается только надеяться на помощь и советы форумчан.
Или посмотреть в любой вменяемый фреймворк (ака VCL ) и подумать, чем "меню" отличается от "элемента меню". Самый простой способ это сделать - разместить их в одной таблице (корень дерева - меню, его дети - элементы первого уровня итп).
...
Рейтинг: 0 / 0
13.12.2011, 19:35
    #37573948
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
andy.sПытался спросить у гугла, но даже не знаю, как вопрос задать

А что спросить-то пытался? Зачем там menu_id? Так ответ будет: совершенно он там не нужен,
выкинь напрочь. Вместе с таблицей menu (если только у меню нет никаких дополнительных
атрибутов, о которых ты скромно забыл упомянуть).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2011, 19:52
    #37573973
andy.s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
Dimitry SibiryakovА что спросить-то пытался? Зачем там menu_id? Так ответ будет: совершенно он там не нужен,
выкинь напрочь. Вместе с таблицей menu (если только у меню нет никаких дополнительных
атрибутов, о которых ты скромно забыл упомянуть).
Да, вижу, что важную вещь я сказать-то и забыл. В таблице menu есть и другие поля, да и вообще понятия "меню" и "пункт меню" разделены. Т.е. есть некоторое меню с полями, характерными только для меню, и есть однотипные элементы. Для примера, в таблице элементов (menu_items) будет поле order, которое указывает на порядок элемента в меню (его можно произвольно менять). Для самих меню это нафик не нужно. Плюс ко всему пункты меню являются ссылками (т.е. нужно поле url, например), а само меню никуда ссылаться не должно. Вот так вот :)
...
Рейтинг: 0 / 0
13.12.2011, 20:33
    #37574041
маню
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
или
menu (id, parent_id, name)
menu_items (menu_id, ... всьо остальное)

или
menu&items (id, parent_id, name, признакк меню это или не меню , ... всьо остальное)
...
Рейтинг: 0 / 0
13.12.2011, 20:56
    #37574069
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
манюmenu (id, parent_id, name)
menu_items (menu_id, ... всьо остальное)
Лучше наоборот:
menu (menu_id, root_item_id, name)
menu_items (id, pаrent_id, ... всьо остальное)

Можно будет подменю вынести как отдельное меню. Профит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2011, 21:29
    #37574120
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
andy.sДа, вижу, что важную вещь я сказать-то и забыл. В таблице menu есть и другие поля,
Тогда решение чуть посложнее - меню ссылается на вершину дерева item-ов.
...
Рейтинг: 0 / 0
13.12.2011, 21:41
    #37574139
andy.s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
softwarerТогда решение чуть посложнее - меню ссылается на вершину дерева item-ов.
Да, такое решение устраивает, только есть один нюанс - вершина дерева item-ов вроде как и не нужна получается (хотя без неё тут никак), т.к. не соответствует какому-то пункту меню, и все поля у неё будут null, кроме id.

Всем спасибо за ответы.
...
Рейтинг: 0 / 0
13.12.2011, 23:47
    #37574316
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
On 12/13/2011 08:24 PM, andy.s wrote:

>
> Но теперь хочется сделать возможность добавлять подпункты меню, т.е. получится
> дерево. Как его хранить - вопрос риторический, но возьмем для примера самый
> простой способ, при котором таблица станет вот такой: (id, menu_id, parent_id,
> name).
>
> Получается, что у каждого подпункта (и под-под-под.. пунктов) будет поле
> menu_id, что меня несколько смущает.


НЕпонятно, что тебя смущаеТ, потому ка ксамый что ни на есть правильный
метод.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.12.2011, 01:52
    #37574400
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
У формального иерархического меню нет никаких ID. Они появляются на этапе реализации. В данном случае ты сам их выдумал. Так подумай теперь, для решения каких практических задач они нужны, какие проблемы создают и как их решать.

Отталкиваясь от твоего решения, можно избавиться от menu_id в иерархической структуре, но можно, напротив протащить в пункт меню ключи всех вложенных меню и избавиться от иерархической структуры. Вопрос только в технической целесообразности преобразования.
...
Рейтинг: 0 / 0
14.12.2011, 14:17
    #37575369
andy.s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
mcureenabУ формального иерархического меню нет никаких ID. Они появляются на этапе реализации. В данном случае ты сам их выдумал. Так подумай теперь, для решения каких практических задач они нужны, какие проблемы создают и как их решать.

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

Извините, но я ничего отсюда не понял :))
...
Рейтинг: 0 / 0
14.12.2011, 15:12
    #37575519
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево + внешний ключ
andy.s,

тут нет никаких id.

Меню верхнего уровня не имеет названия и как правило отображается на экране не так как подменю.
Элементами меню могут быть пункты, вызывающие некоторые действия do_it() и/или подменю, которые содержат свои пункты.

Для поиска меню в БД может понадобится идентификатор этого меню.
Можно не менять модель, а использовать и таблицу ссылок на Меню.
Но можно добавить в меню название, как у Подменю, тогда структуры данных, Меню и Подменю становятся одинаковыми. Вместо класса Меню можно использовать Подменю.

Нужно заметить, что включение класса в себя запрещено в языках программирования из-за бесконечной рекурсии. Поэтому в Подменю придётся сделать ссылку Элемент или на массив элемент.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дерево + внешний ключ / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]