|
|
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
Всем здрасте. Чтобы не объяснять абстрактно, сразу приведу пример: Есть таблица menu, в которой хранятся разные меню (не ресторанные, а наподобие меню на сайтах). Структура: (id, name). У каждого меню есть элементы, которые хранятся в таблице menu_items со структурой: (id, menu_id, name). Но теперь хочется сделать возможность добавлять подпункты меню, т.е. получится дерево. Как его хранить - вопрос риторический, но возьмем для примера самый простой способ, при котором таблица станет вот такой: (id, menu_id, parent_id, name). Получается, что у каждого подпункта (и под-под-под.. пунктов) будет поле menu_id, что меня несколько смущает. Пытался спросить у гугла, но даже не знаю, как вопрос задать, голова уже плохо работает под вечер :)) Остается только надеяться на помощь и советы форумчан. Заранее спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 19:24 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
andy.sОстается только надеяться на помощь и советы форумчан. Или посмотреть в любой вменяемый фреймворк (ака VCL ) и подумать, чем "меню" отличается от "элемента меню". Самый простой способ это сделать - разместить их в одной таблице (корень дерева - меню, его дети - элементы первого уровня итп). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 19:32 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
andy.sПытался спросить у гугла, но даже не знаю, как вопрос задать А что спросить-то пытался? Зачем там menu_id? Так ответ будет: совершенно он там не нужен, выкинь напрочь. Вместе с таблицей menu (если только у меню нет никаких дополнительных атрибутов, о которых ты скромно забыл упомянуть). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 19:35 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА что спросить-то пытался? Зачем там menu_id? Так ответ будет: совершенно он там не нужен, выкинь напрочь. Вместе с таблицей menu (если только у меню нет никаких дополнительных атрибутов, о которых ты скромно забыл упомянуть). Да, вижу, что важную вещь я сказать-то и забыл. В таблице menu есть и другие поля, да и вообще понятия "меню" и "пункт меню" разделены. Т.е. есть некоторое меню с полями, характерными только для меню, и есть однотипные элементы. Для примера, в таблице элементов (menu_items) будет поле order, которое указывает на порядок элемента в меню (его можно произвольно менять). Для самих меню это нафик не нужно. Плюс ко всему пункты меню являются ссылками (т.е. нужно поле url, например), а само меню никуда ссылаться не должно. Вот так вот :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 19:52 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
или menu (id, parent_id, name) menu_items (menu_id, ... всьо остальное) или menu&items (id, parent_id, name, признакк меню это или не меню , ... всьо остальное) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 20:33 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
маню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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 20:56 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
andy.sДа, вижу, что важную вещь я сказать-то и забыл. В таблице menu есть и другие поля, Тогда решение чуть посложнее - меню ссылается на вершину дерева item-ов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 21:29 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
softwarerТогда решение чуть посложнее - меню ссылается на вершину дерева item-ов. Да, такое решение устраивает, только есть один нюанс - вершина дерева item-ов вроде как и не нужна получается (хотя без неё тут никак), т.к. не соответствует какому-то пункту меню, и все поля у неё будут null, кроме id. Всем спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 21:41 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 23:47 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
У формального иерархического меню нет никаких ID. Они появляются на этапе реализации. В данном случае ты сам их выдумал. Так подумай теперь, для решения каких практических задач они нужны, какие проблемы создают и как их решать. Отталкиваясь от твоего решения, можно избавиться от menu_id в иерархической структуре, но можно, напротив протащить в пункт меню ключи всех вложенных меню и избавиться от иерархической структуры. Вопрос только в технической целесообразности преобразования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 01:52 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
mcureenabУ формального иерархического меню нет никаких ID. Они появляются на этапе реализации. В данном случае ты сам их выдумал. Так подумай теперь, для решения каких практических задач они нужны, какие проблемы создают и как их решать. Отталкиваясь от твоего решения, можно избавиться от menu_id в иерархической структуре, но можно, напротив протащить в пункт меню ключи всех вложенных меню и избавиться от иерархической структуры. Вопрос только в технической целесообразности преобразования. Извините, но я ничего отсюда не понял :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 14:17 |
|
||
|
Дерево + внешний ключ
|
|||
|---|---|---|---|
|
#18+
andy.s, тут нет никаких id. Меню верхнего уровня не имеет названия и как правило отображается на экране не так как подменю. Элементами меню могут быть пункты, вызывающие некоторые действия do_it() и/или подменю, которые содержат свои пункты. Для поиска меню в БД может понадобится идентификатор этого меню. Можно не менять модель, а использовать и таблицу ссылок на Меню. Но можно добавить в меню название, как у Подменю, тогда структуры данных, Меню и Подменю становятся одинаковыми. Вместо класса Меню можно использовать Подменю. Нужно заметить, что включение класса в себя запрещено в языках программирования из-за бесконечной рекурсии. Поэтому в Подменю придётся сделать ссылку Элемент или на массив элемент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 15:12 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37574041&tid=1541899]: |
0ms |
get settings: |
13ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
190ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 566ms |

| 0 / 0 |
