好消息!从4.8版开始,BerkeleyDB就有了c#接口。BerkeleyDB对我来说是一件非常有趣的事情,因为它是非SQL性质的。我知道如果有人想要存储很多键/值对,这是一个很好的工具。我知道“可附加”表。我不知道的是如何用BerkeleyDB存储分层数据。一般来说,它是否适用于此?
我想做什么?我想存储dmoz.org数据。现在,我已经将所有的rdf导入到MySQL数据库中。但我不需要存储过程或其他复杂的功能。我想使用BerkeleyDB作为我的在线RSS阅读器的数据存储。因此,在类别树中有提要(正如我所说的,我从dmoz导入的类别。我有很多这样的东西,还有feeds数百万)。还有..。我忘了提要项了。我也想用BerkleyDB :-)来存储它们。
看起来我必须手动实现所有的关系,,,这没问题…但我问的最重要的事情是速度。我使用BerkeleyDB的解决方案会比基于MySQL(或任何关系数据库管理系统)的解决方案更快吗?
发布于 2009-11-04 02:44:21
它适用于此,但它可能会比您愿意投入的工作量更多。BerkeleyDB是一个非常通用的键/值存储,所以您所要做的就是说"for key X,store value Y“。稍后你可以说“给我键X的值”,它会给你返回Y。这就是它从高层次上所做的一切。它具有非常健壮的特性来保证重要的可靠性属性(称为ACID,用于原子性、一致性、隔离性和持久性),并且具有很好的性能,但从程序员的角度来看,它是一个简单的映射结构。
所以,是的,你可以存储树,但你需要为它们选择一个好的表示。您可以使用整数键(确保它们以big-endian字节顺序存储,因为BDB对键使用字典排序),并简单地将一个struct作为包含子元素整数列表的值。不过,你仍然需要手工编写所有的遍历算法。但是,如果不知道您对分层数据有什么要求,就很难给出更具体的建议。
就Speedwise而言,Berkeley DB可能无法获得更快的速度(即,您不会找到更快的东西,特别是如果您愿意牺牲一些ACID属性的话)。它让你几乎可以完全控制你的map接口,所以理论上你可以为你的特定用例构建一个高度优化的结构。但是,考虑到底层接口,如果您要在其上实现连接、复杂的过滤器查询或任何类型的非平凡查询语言,则必须编写一些非常快速的代码和算法来跟上大型关系数据库的步伐。
如果您的数据可以用XML建模(但我知道有些人喜欢它),那么就有一个基于BDB的现有数据库,称为BDB XML (也是由Sleepycat开发的,现在是Oracle的一部分)。这允许您在数据库中存储任意的XML文档,并对数据库执行快速的XPath和XQuery查询。我认为目前还没有正式的.NET应用程序接口,但我非常确定我已经遇到了一个非官方的.NET绑定到它。
通常,除非您有一些现有解决方案不允许的非常特殊的需求(您的场景似乎不是这样),否则我建议不要滚动您自己的数据库(即使是构建在BDB之上),除非您非常熟练地使用高效的算法和代码优化。如果要存储RDF三元组,则有专门的数据库用于存储,即使是关系数据库也不是特别适合它们。BDB XML仍然是一个可行的解决方案。这最终取决于您的选择,但如果我是您,我会选择处理更有趣的问题,而不必处理低级数据库操作(因此,我会在现有包的基础上使用一个薄层作为我的实际RDF存储)。
发布于 2009-11-04 02:42:07
层次结构可以使用父属性或子属性存储在键值存储中。
如果希望父节点有一个或多个子节点,请在每条记录上使用一个父节点属性,并使根节点的父节点的ID为0或其他有意义的值。
如果希望子项具有一个或多个父项,请在每个记录上使用子项属性。
如果需要,节点可能有多个父节点,并且子节点使用单独的表来存储关系。
这样,您可以通过查询具有特定父节点或子节点的节点来遍历树。
https://stackoverflow.com/questions/1669278
复制相似问题