分层数据和BerkeleyDB

时间:2009-11-03 18:31:22

标签: .net hierarchical-data berkeley-db

好消息!从版本4.8 BerkeleyDB开始就有c#接口。 BerkeleyDB对我来说是一个非常有趣的事情,因为它具有非SQL特性。我知道如果有人想要存储大量的键/值对,这是一个很好的工具。我知道'可附着'的桌子。我不知道的是如何使用BerkeleyDB存储分层数据。一般来说它适合这个吗?

我想做什么?我想存储dmoz.org数据。现在我将所有thd rdfs导入MySQL db。但我不需要存储过程或其他复杂功能。我想将BerkeleyDB用作我的在线RSS阅读器的数据存储。所以在类别树中有提要(正如我所说的那些我从dmoz导入的类别。我有很多它们,以及数量 - 数百万)。而且......我忘记了饲料。我想用BerkleyDB存储它们:-)。

看起来我必须手动实现所有关系,,,没关系......但我要问的最重要的是速度。 Will(Can)我的BerkeleyDB解决方案比基于MySQL(或一般的任何RDBMS)更快吗?

2 个答案:

答案 0 :(得分:2)

它适用于此,但它可能比你愿意投入更多的工作.BerkeleyDB是一个非常通用的键/值存储,所以你所做的只是说“对于键X,存储值Y”。之后你可以说“给我关键X的价值”它会给你回Y.这真的是它从高层做的全部。它具有非常强大的功能,可以保证重要的可靠性属性(称为ACID,用于原子性,一致性,隔离性和耐久性),并且具有出色的性能,但从程序员的角度来看,它是一个简单的映射结构。

所以是的,你可以存储树木,但你需要决定它们的良好表现形式。您可以使用整数键(确保它们以big-endian字节顺序存储,因为BDB在键上使用字典顺序)并且只需要一个struct作为包含子项整数列表的值。但是,您仍然需要手动编写所有遍历算法。虽然不知道对分层数据有什么要求,但很难给出更具体的建议。

速度方面,Berkeley DB的功能可能不会快得多(也就是说,你不会发现更快,特别是如果你愿意牺牲一些ACID属性)。它几乎可以完全控制您的地图界面,因此理论上您可以为您的特定用例构建高度优化的结构。但是,考虑到低级接口,如果您正在实现连接,复杂的过滤器查询或任何类型的非平凡查询语言,您将不得不编写一些非常快速的代码和算法来跟上大关系数据库。

如果您的数据可以通过XML建模(但我知道有些人喜欢它),那么现有的数据库就构建在BDB之上,称为BDB XML(也是Sleepycat,现在是Oracle的一部分)。这允许您在数据库中存储任意XML文档,并在数据库上执行快速XPath和XQuery查询。我认为这还没有正式的.NET API,但我很确定我遇到过非官方的.NET绑定。

一般情况下,除非你有一些非常特殊的要求,现有的解决方案不允许(你的场景似乎不是这样),我建议不要滚动你自己的数据库(甚至建在顶层除非你非常熟练地使用有效的算法和代码优化。如果你正在存储RDF三元组,那么就有专门的数据库,甚至关系数据库也不是特别适合它们。 BDB XML仍然是一个可行的解决方案。它最终是你的选择,但如果我是你,我会选择处理更有趣的问题,而不必处理低级数据库操作(因此在我的实际RDF存储中使用现有包上的薄层)。 / p>

答案 1 :(得分:1)

可以使用父或子属性将分层结构存储在键值存储中。

如果您希望父级有一个或多个子级,请在每条记录上使用父属性,并让根节点的父级为ID 0或其他有意义的值。

如果您希望孩子有一个或多个父母,请在每条记录上使用子属性。

如果您希望节点可能有多个父节点,并且子节点使用单独的表来存储关系。

通过这种方式,您可以通过查询具有特定父级或子级的节点来遍历树。