【问题标题】:Nested Sets model or some other model for representing hierarchy?嵌套集模型或其他表示层次结构的模型?
【发布时间】:2011-04-04 22:21:20
【问题描述】:

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

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

...等等。

系统中的一切,无论好坏,都存储为 XML 记录;这就是存储系统的工作原理。

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

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

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

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

  1. 每次插入项目时,您 必须更改 right 和/或 许多节点的left 值。 我无法对 XML 进行批量更新 文件,所以我必须更新每个 一个人。
  2. 虽然有让我过滤的搜索功能 “小于”或“大于”(所以我 理论上只能拉 相关子节点或父节点 给定类别的),我无法订购 XML 记录按属性。所以 我必须检索所有 文档,将它们转换为 可以排序的对象列表 (在这种情况下使用 Python)然后 使用lambda 函数对它们进行排序。

由于我的数据存储模型与使用 NoSQL 存储数据没有明显不同,我想知道是否有人使用该存储机制提出了处理和存储分层数据的好方法。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想我很困惑。我不认为 MySQL、SQLite 或 PostgreSQL 是“平面”数据库……我可以轻松地将嵌套模型与它们中的任何一个一起使用。对于这个用例,我需要在实际平面数据库中工作的东西(想想哈希键)。
    【解决方案2】:

    不确定这对您的用例有多适用,但作为一个想法,也许使用Beautiful Soup 会有所帮助。也许它的默认分层表示足以满足您的需求。

    【讨论】:

    • No BeautifulSoup 是关于解析 HTML 或 XHTML 的。它与处理、存储和组织分层数据有关。
    • 抱歉,我误解了这个问题,我以为您问的是如何在代码中而不是持久存储中表示您的数据。对此感到抱歉。
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多