Форум сайта python.su
Какой формат данных лучше использовать для хранения иерархических меню? Нужна ли СУБД если количество всех (категорий включая вложенные) меню около 400. Меню будет выводиться в GUI таким образом: Выбрал категорию, появился список соответствующих подкатегорий и т. д.
Отредактировано Rudium (Янв. 8, 2016 10:28:41)
Офлайн
Вопрос из разряда “Летели два жирафа, один большой другой на север. Сколько яблок у Васи?”.
Что за проект, какие меню (400 пунктов меню? вы серьезно?), как они будут редактироваться, как организуется иерархия - ничего не сказал. При таком подходе ответ на ваш вопрос - нет, вам не нужна СУБД.
Офлайн
Десять категорий. Каждая категория содержит несколько подкатегорий, каждая подкатегория содержит несколько пунктов или подкатегорий с пунктами. Как файловая структура в ОС. Задача состоит в выборе способа хранения данных, для того, чтобы было удобно выводить в GUI возможность выбора пункта, находящегося в на любом уровне подкатегории. Например категория “Жирафы содержит две подкатегории: ”большие“ и ”летящие на север“. В свою очередь подкатегория ''большие” содержит пункт “любящие яблоки” и еще несколько пунктов. Подкатегория “летящие на север” содержит пункты “принадлежащие Васе” и еще несколько пунктов. Всего категорий и пунктов около 400 (рекурсивная функция обошла всю иерархию и посчитала) Уровень вложенности любого пункта не более 4. Сейчас данные хранятся в виде вложенных списков, примерно вот так:
menu = ['Категория1',['Подкатегория1',['Пункт1', 'Пункт2'', Пункт3']],'Категория2',['Подкатегория1',['Пункт1', 'Пункт2', 'Пункт3']]]
Офлайн
RudiumЕсли они у вас уже как-то хранятся сейчас, то в чем суть вопроса?
Сейчас данные хранятся в виде вложенных списков
Офлайн
Вопрос не хранения, а удобства выборки. Если GUI запрашивает категорию, ее нужно найти, и вытащить входящие в нее пункты. Удобнее это делать запросом к СУБД а не собственным алгоритмом, который еще нужно придумать.)))
Офлайн
Вот функция которая проходит все элементы дерева.
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)
Офлайн
То есть у вас названия категорий являются их же идентификаторами? А если в двух категориях будут пункты или подкатегории с одинаковыми названиями?
Сделайте нормальный класс дерева с узлами и ветвями.
Офлайн
Спасибо за совет. Вы имеете ввиду нужно будеть задействовать OOП ?
Офлайн
Дорогой, у вас 400 пунктов меню, гуёвое приложение, вы собираетесь использовать СУБД и спрашиваете задействовать ли вам ООП?
Офлайн
# -*-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)
Офлайн