嵌套集模型或用于表示层次结构的其他模型?

时间:2011-04-04 22:21:20

标签: python xml hierarchical-data nested-sets flat

我有一个项目,我希望在基本上是平面数据库系统(简而言之,它是XML记录的集合)中存储分层信息(特别是类别和子类别)。我想在系统中存储有关类别和子类别的信息:

  • 动物
    • 脊椎动物
    • 脊椎动物
  • 天气
  • 建筑物
    • 摩天大楼
    • 历史建筑

......等等。

无论好坏,

系统中的所有都存储为XML记录;这就是存储系统的工作原理。

这意味着系统中的每个类别也都存储为XML记录,如下所示:

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

所以我想知道如何在这些约束条件下实现层次结构。

我习惯于在关系数据库中存储数据。在那些情况下,我几乎总是使用nested set model。在这种情况下,这似乎不是一个好的选择,因为:

  1. 每次插入项目时,您 必须更改right和/或 许多节点的left值。 我无法对XML进行批量更新 文件,所以我必须更新每个 一个人。
  2. 虽然有搜索功能让我过滤 “小于”或“大于”(所以我 理论上可以只拉动 相关的子节点或父节点 一个给定的类别),我无法订购 按属性的XML记录。所以 我必须检索所有的 文件,将它们转换成一个 可以排序的对象列表 (在这种情况下使用Python)然后 使用lambda函数对它们进行排序。
  3. 由于我的数据存储模型与使用NoSQL存储数据没有显着差异,我想知道是否有人使用该存储机制提出了处理和存储分层数据的好方法。

2 个答案:

答案 0 :(得分:1)

此类(基于Peewee ORM)允许您使用平面关系数据库处理分层数据(支持PostgreSQL,MySQL和SQLite):

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

您可以在类方法中进行一些更改,以便更改也应用于您正在操作的XML文件。

答案 1 :(得分:0)

不确定这对您的用例有多适用,但考虑一下,使用Beautiful Soup可能会有所帮助。也许它的默认层次表示就足以满足您的需求。