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

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

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

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

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

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

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

или
menu&items (id, parent_id, name, признакк меню это или не меню , ... всьо остальное)
...
Рейтинг: 0 / 0
Дерево + внешний ключ
    #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
Дерево + внешний ключ
    #37574120
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy.sДа, вижу, что важную вещь я сказать-то и забыл. В таблице menu есть и другие поля,
Тогда решение чуть посложнее - меню ссылается на вершину дерева item-ов.
...
Рейтинг: 0 / 0
Дерево + внешний ключ
    #37574139
andy.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerТогда решение чуть посложнее - меню ссылается на вершину дерева item-ов.
Да, такое решение устраивает, только есть один нюанс - вершина дерева item-ов вроде как и не нужна получается (хотя без неё тут никак), т.к. не соответствует какому-то пункту меню, и все поля у неё будут null, кроме id.

Всем спасибо за ответы.
...
Рейтинг: 0 / 0
Дерево + внешний ключ
    #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
Дерево + внешний ключ
    #37574400
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У формального иерархического меню нет никаких ID. Они появляются на этапе реализации. В данном случае ты сам их выдумал. Так подумай теперь, для решения каких практических задач они нужны, какие проблемы создают и как их решать.

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

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

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

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

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

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

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


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