【问题标题】:database to store a huge tree存储一棵大树的数据库
【发布时间】:2012-07-25 10:36:20
【问题描述】:

我需要解决的问题是将文件系统树的等价物存储到数据库中(以加快搜索操作)。树包含 +400.000.000 个 inode,对于每个 inode,我需要存储一些元信息(平均文件路径为 100 字节,元信息约为 50 字节)。

将在 C++ 程序中进行以下操作:
1. SELECT(预期结果:~200.000)
2. 一次插入约 20.000 条记录
3. 一次删除约 20.000 条记录。

到目前为止,我只考虑了关系数据库:MySQL、MariaDB、PostgresSQL(到目前为止我还没有进行任何测试,我仍处于“信息收集”阶段)并且我阅读了一些关于将树存储在这样一个数据库。

第一个选项
- 邻接表模型:表中的每一项都包含一个指向其父项的指针。
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

第二个选项
- 将所有目录存储在单独的表中
- 为其余文件创建一个单独的表,并带有指向它们所属目录的指针

所以表格将如下所示:
目录表:

/home  
/home/test/

文件表:

file1
file2

我的问题:
1.你知道另一种适合在关系数据库中存储大树的模型吗? 2. 如果我要搜索 NoSQL DB,我应该从哪里开始?

非常感谢。

【问题讨论】:

  • 您可以查看分层数据库,例如 LDAP(OpenDS、OpenDJ、OpenLDAP)。你想优化什么样的搜索操作?例如。在树中的任何位置搜索具有给定名称的文件以及搜索具有一组限制在子树中的属性的文件,最好通过稍微不同的数据组织来实现。
  • 嗨乔尼。因为我们每次操作都要对单个文件(从子树)进行大量搜索,所以我们认为最好从内存中的子树加载所有文件(比如说,200.000 个条目),尽可能减少内存占用,然后在内存中进行所有查找。否则(每个文件单选)效率太低。

标签: mysql database file tree


【解决方案1】:

听起来您最好使用一种结构,该结构可以通过单个选择为您提供整个子树。有几种方法可以实现这一点,每种方法都有其优点和缺点:

  • 在嵌套集中,您可以向表中添加两列:lft 和 rgt。节点的子树的 lft 和 rgt 值介于节点的 lft 和 rgt 值之间。此模型查询起来很简单,但对树的更改需要重写整个树的 lft 和 rgt 值,因此更新成本可能很高。
  • 路径枚举将维护列中文件的绝对路径。该模型查询起来也很简单,但您只能索引路径的固定长度前缀这一事实限制了可以有效搜索的树的深度。
  • 对于闭包表,您需要为系统上的每个目录添加一个新表,该表包含子树中某处包含的文件的 ID。同样,查询很简单,但闭包表可能会变得相当大,并且如果目录被移动,则必须更新。

此幻灯片通过图表和示例代码解释了这些模型:http://www.slideshare.net/billkarwin/models-for-hierarchical-data

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2020-11-01
    • 2014-09-24
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多