Модель вложенных наборов или какая-то другая модель для представления иерархии?

У меня есть проект, в котором я надеюсь хранить иерархическую информацию (в частности, категории и подкатегории) в том, что в основном представляет собой плоскую систему базы данных (короче говоря, это набор записей XML). Я хотел бы хранить информацию о категориях и подкатегориях в системе:

  • Animals
    • Invertebrates
    • Позвоночные
  • Погода
  • Buildings
    • Skyscrapers
    • Исторические здания

...и так далее.

Все в системе, хорошо это или плохо, хранится в виде записи XML; именно так работает система хранения.

Это означает, что каждая категория в системе также хранится в виде записи XML, например:

<record id="12345">
   <attribute name="Skyscrapers" />
   <attribute type="Category" />
</record>

Поэтому мне интересно, как реализовать иерархию при этих ограничениях.

Я привык к хранению данных в реляционной базе данных. В таких случаях я почти всегда использую модель вложенного множества. Похоже, что в данном случае это не лучший выбор, потому что:

  1. Каждый раз, когда вы вставляете элемент, вы должны изменить значения right и/или left для многих узлов. Я не могу выполнять массовое обновление XML-файлов, поэтому мне придется обновлять каждый по отдельности.
  2. Хотя есть функции поиска, которые позволяют мне фильтровать по параметрам «меньше» или «больше» (так что теоретически я могу получить только соответствующие дочерние узлы или родительские узлы данной категории), я не могу упорядочить записи XML. по атрибутам. Поэтому мне пришлось бы получить все документы, преобразовать их в список объектов, которые можно отсортировать (в данном случае с помощью Python), а затем отсортировать их с помощью функции lambda.

Поскольку моя модель хранения данных не сильно отличается от хранения данных с использованием NoSQL, мне было интересно, придумал ли кто-нибудь, использующий этот механизм хранения, хороший прием для обработки и хранения иерархических данных.


person Jordan Reiter    schedule 04.04.2011    source источник


Ответы (2)


Этот класс (на основе Peewee ORM) позволяет обрабатывать иерархические данные с плоской реляционной базой данных. (Поддерживаются PostgreSQL, MySQL и SQLite):

https://github.com/mathieurodic/peewee-tree/blob/master/node.py

Вы можете внести несколько изменений в методы класса, чтобы эти изменения также применялись к XML-файлу, с которым вы работаете.

person Mathieu Rodic    schedule 12.06.2014
comment
Думаю, я запутался. Я не считаю MySQL, SQLite или PostgreSQL плоскими базами данных… Я могу легко использовать вложенную модель с любой из них. Для этого варианта использования мне нужно было что-то, что работало бы в реальной плоской базе данных (например, хэш-ключ). - person Jordan Reiter; 08.07.2014

Не уверен, насколько это применимо к вашему варианту использования, но как мысль, возможно, с помощью Beautiful Soup поможет. Возможно, для ваших нужд будет достаточно иерархического представления по умолчанию.

person Will Madison    schedule 04.04.2011
comment
Никакой BeautifulSoup не занимается разбором HTML или XHTML. Это никак не связано с обработкой, хранением и организацией иерархических данных. - person Jordan Reiter; 05.04.2011
comment
Приношу свои извинения, я неправильно понял вопрос, я думал, вы спрашиваете о том, как представлять ваши данные в коде, а не в постоянном хранилище. Извини за это. - person Will Madison; 05.04.2011