它适合那个,但它可能比你愿意投入的工作更多。BerkeleyDB 是一个非常通用的键/值存储,所以你要做的就是说“对于键 X,存储值 Y”。稍后你可以说“给我键 X 的值”,它会给你返回 Y。这就是它从高层次上所做的一切。它具有非常强大的特性来保证重要的可靠性属性(称为 ACID,表示原子性、一致性、隔离性和持久性),并且具有出色的性能,但从程序员的角度来看,它是一个简单的映射结构。
所以是的,你可以存储树,但你需要为它们决定一个好的表示。您可以使用整数键(确保它们以大端字节顺序存储,因为 BDB 对键使用字典顺序)并且只需将结构作为包含子整数列表的值。不过,您仍然必须手动编写所有遍历算法。在不知道您对分层数据有什么要求的情况下,很难给出更具体的建议。
Speedwise,因为它所做的 Berkeley DB 可能不会变得更快(即,你不会发现那里更快,特别是如果你愿意牺牲一些 ACID 属性)。它使您几乎可以完全控制地图界面,因此理论上您可以为您的特定用例构建高度优化的结构。然而,考虑到低级接口,如果你正在实现连接、复杂的过滤器查询或任何类型的非平凡查询语言,你将不得不编写一些非常快速的代码和算法来跟上大关系数据库在那里。
如果您的数据可以通过 XML 建模(嗯,但我知道有些人喜欢它),那么有一个基于 BDB 构建的现有数据库,称为 BDB XML(也是 Sleepycat,现在是 Oracle 的一部分)。这允许您在数据库中存储任意 XML 文档,并在数据库上执行快速 XPath 和 XQuery 查询。我认为目前还没有官方的 .NET API,但我很确定我遇到了非官方的 .NET 绑定。
一般来说,除非您有一些现有解决方案不允许的非常特殊的要求(您的场景似乎不是这种情况),否则我建议您不要滚动您自己的数据库(即使构建在 BDB 之上)除非你非常擅长高效的算法和代码优化。如果您要存储 RDF 三元组,则有专门的数据库来处理,甚至关系数据库也不是特别不适合它们。BDB XML 仍然是一个可行的解决方案。这最终是你的选择,但如果我是你,我会选择解决更有趣的问题,而不必处理低级数据库操作(因此会在现有包上为我的实际 RDF 存储使用一个薄层)。