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

2 投票
2 回答
1026 浏览
提问于 2025-04-16 15:05

我有一个项目,想在一个基本上是平面的数据库系统中存储层级信息(具体来说,就是分类和子分类)。简单来说,这个系统是一些XML记录的集合。我想在系统中存储关于分类和子分类的信息:

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

……等等。

系统中的一切,无论好坏,都是以XML记录的形式存储的;这就是存储系统的工作方式。

这意味着系统中的每个分类也都是以XML记录的形式存储的,像这样:

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

所以我在想,在这些限制条件下,如何实现层级结构。

我习惯于在关系型数据库中存储数据。在这种情况下,我几乎总是使用嵌套集合模型。但在这个情况下,这似乎不是一个好的选择,因为:

  1. 每次插入一个项目时,你必须更改许多节点的right和/或left值。我不能对XML文件进行批量更新,所以我必须逐个更新。
  2. 虽然有一些搜索功能可以让我按“小于”或“大于”进行过滤(理论上我可以只提取某个分类的相关子节点或父节点),但我无法按属性对XML记录进行排序。所以我必须先检索所有文档,将它们转换成可以排序的对象列表(在这个例子中用Python),然后再使用lambda函数进行排序。

由于我的数据存储模型与使用NoSQL存储数据没有显著区别,我想知道有没有人使用这种存储机制找到处理和存储层级数据的好方法。

2 个回答

0

我不太确定这个建议对你的情况是否合适,但我想说的是,可以试试使用Beautiful Soup。它默认的层级结构可能正好满足你的需求。

1

这个类是基于Peewee ORM的,它可以让你在一个简单的关系数据库中处理层级数据(支持PostgreSQL、MySQL和SQLite):

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

你可以对这个类的方法做一些修改,这样你在操作的XML文件中也会反映出这些变化。

撰写回答