Найти - Пользователи
Полная версия: Организация иерархических меню
Начало » Базы данных » Организация иерархических меню
1 2 3
Rudium
Какой формат данных лучше использовать для хранения иерархических меню? Нужна ли СУБД если количество всех (категорий включая вложенные) меню около 400. Меню будет выводиться в GUI таким образом: Выбрал категорию, появился список соответствующих подкатегорий и т. д.
FishHook
Вопрос из разряда “Летели два жирафа, один большой другой на север. Сколько яблок у Васи?”.

Что за проект, какие меню (400 пунктов меню? вы серьезно?), как они будут редактироваться, как организуется иерархия - ничего не сказал. При таком подходе ответ на ваш вопрос - нет, вам не нужна СУБД.
Rudium
Десять категорий. Каждая категория содержит несколько подкатегорий, каждая подкатегория содержит несколько пунктов или подкатегорий с пунктами. Как файловая структура в ОС. Задача состоит в выборе способа хранения данных, для того, чтобы было удобно выводить в GUI возможность выбора пункта, находящегося в на любом уровне подкатегории. Например категория “Жирафы содержит две подкатегории: ”большие“ и ”летящие на север“. В свою очередь подкатегория ''большие” содержит пункт “любящие яблоки” и еще несколько пунктов. Подкатегория “летящие на север” содержит пункты “принадлежащие Васе” и еще несколько пунктов. Всего категорий и пунктов около 400 (рекурсивная функция обошла всю иерархию и посчитала) Уровень вложенности любого пункта не более 4. Сейчас данные хранятся в виде вложенных списков, примерно вот так:
menu = ['Категория1',['Подкатегория1',['Пункт1', 'Пункт2'', Пункт3']],'Категория2',['Подкатегория1',['Пункт1', 'Пункт2', 'Пункт3']]]
P.S Серьезно почти 400 элементов содержит меню. Это будет планировщик подачи объявлений на доску объявлений.
FishHook
Rudium
Сейчас данные хранятся в виде вложенных списков
Если они у вас уже как-то хранятся сейчас, то в чем суть вопроса?
Rudium
Вопрос не хранения, а удобства выборки. Если GUI запрашивает категорию, ее нужно найти, и вытащить входящие в нее пункты. Удобнее это делать запросом к СУБД а не собственным алгоритмом, который еще нужно придумать.)))
Rudium
Вот функция которая проходит все элементы дерева.
indent = ''# отступ
count = 0# количество элементов
def get_subcategory(obj):
    global indent
    global count
    if isinstance(obj, str):
        print(indent + obj)
        count += 1
    elif isinstance(obj[1], str):
        for row in obj:
            get_subcategory(row)
    else:
        for row in obj:
            get_subcategory(row)
            indent += '.'
get_subcategory(category) #category - древовидная иерархия вложенных списков.
print(count)
FishHook
То есть у вас названия категорий являются их же идентификаторами? А если в двух категориях будут пункты или подкатегории с одинаковыми названиями?
Сделайте нормальный класс дерева с узлами и ветвями.
Rudium
Спасибо за совет. Вы имеете ввиду нужно будеть задействовать OOП ?
FishHook
Дорогой, у вас 400 пунктов меню, гуёвое приложение, вы собираетесь использовать СУБД и спрашиваете задействовать ли вам ООП?
FishHook
# -*-coding:utf-8-*-
class Node:
    def __init__(self, name, verbose_name=None, parent=None):
        self.name = name
        self.parent = parent
        self.verbose_name = verbose_name or self.name
        self.children = []
    def add(self, node):
        self.children.append(node)
        if isinstance(node, Node):
            node.parent = self
    def __str__(self):
        return "{name}: [{children}]".format(name=self.verbose_name,
                                             children=", ".join(str(c) for c in self.children))
    def __getitem__(self, item):
        for c in self.children:
            if isinstance(c, Node):
                if c.name == item:
                    return c
class Tree:
    def __init__(self, root_node=None):
        self.root = root_node
    def set_root(self, name, verbose_name=None):
        node = Node(name, verbose_name)
        self.root = node
    def __getitem__(self, item):
        return self.root[item]
    def __str__(self):
        return str(self.root)       
t = Tree()
t.set_root("root", "Главная ветка")
r = t.root
r.add(Node("category1"))
r.add(Node("category2"))
r["category1"].add("Item1")
r["category1"].add("Item2")
r["category1"].add("Item3")
print(t)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB