3

我正处于为 C++ 设计一个基于图形(或键值)的数据库库的准备阶段,这里的许多人会发现它类似于http://neo4j.org/等项目。

由于这是设计的一个非常早期的阶段,我的要求很简单,未提炼并且(我承认)可能仍然相当幼稚:

  • 有向无环图
    • 树状结构,少根多叶
    • 分支可能包含对其他分支的引用
    • 但是没有循环
    • 该图由键值对表示,其中键和值大部分是简单类型(整数),但有些可能指的是更复杂的类型,例如字符串
  • 查询
    • 简单查询通常会返回边。即从这个根开始的边缘对应于(键/值/键值元组)?
    • 使用键字符串(键、键、键、值)的查询
  • 访问模式和性能
    • 应强调快速查找
    • 添加边缘
    • 但是没有从图中删除边/节点。即图表会增长,但永远不会缩小。
    • 可以在图上执行优化,以优化缓存使用的内存布局
    • 图表的大小约为 1 MB - 2 GB,并且大部分应该适合主内存

鉴于这些粗略的要求是一项挑战,您主要关心的是:

  • 内存存储:布局、分配
    • 例如,固定大小的块池?
    • 通过聚类算法分配内存?
  • 快速查询
  • 动态重组
    • 如何处理边/节点的添加?
    • 优化更新(例如改进内存布局)
  • 并发访问
    • 例如,通过优化线程处理对内存布局的更改?

我正在寻找工作的良好起点,因此我很高兴收到对现有工作的参考。最重要的是:我应该考虑哪些我没有考虑的事情?

4

2 回答 2

4

但是没有循环

如果您需要快速刃口刀片,这是一个很高的要求。在最坏的情况下验证一条新边不引入循环是 O(v+e)(其中 v 是顶点数,e 是边数)。它可能还排除了边的并发插入。考虑将此要求设为可选。

另一种选择是区分两个插入操作:CheapInsertExpensiveInsert. 让每个顶点都有一个“等级”整数,并且只允许从较低等级的顶点到较高等级的顶点廉价插入边。昂贵的插入将没有此约束,并且会在必要时自动重写排名。客户端可以检查和更改任何顶点的等级(只要不破坏从低到高的规则)。通过这种方式,他们可以实现自己的插入策略,可能通过利用图的某些特定属性来避免昂贵的插入。

于 2009-09-03T08:25:33.317 回答
2

您可能有兴趣参考的快速键/值数据库是 TinyCDB http://www.corpit.ru/mjt/tinycdb.html

于 2009-09-03T00:32:24.023 回答