Модель Nested Sets или какая-то другая модель для представления иерархии? - PullRequest
2 голосов
/ 05 апреля 2011

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

  • Животные
    • Беспозвоночные
    • Позвоночные
  • Погода
  • Здания
    • Небоскребы
    • Исторические здания

... и пр.

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 12 июня 2014

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

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

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

0 голосов
/ 05 апреля 2011

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

...