好消息!自 4.8 版本起,BerkeleyDB 就有了 C# 接口。BerkeleyDB 对我来说非常有趣,因为它具有非 SQL 性质。我知道如果有人想存储大量键/值对,这是一个很好的工具。我知道“可附加”桌子。我不知道如何使用 BerkeleyDB 存储分层数据。一般情况下适合这个吗?

我想做的事?我想存储 dmoz.org 数据。现在我已经将所有 rdfs 导入到 MySQL 数据库中。但我不需要存储过程或其他复杂的功能。我想使用 BerkeleyDB 作为我的在线 RSS 阅读器的数据存储。因此,类别树中有提要(正如我所说,我从 dmoz 导入的类别)。我有很多,还有提要——数百万)。和...我忘记了饲料项目。我也想用 BerkleyDB 存储它们:-)。

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

有帮助吗?

解决方案

适用于这一点,但比你愿意投入它可能是更多的工作。BerkeleyDB的是一个非常普遍的键/值存储,所以你要做的是说“关键X,储值Y”。后来,你可以说“给我的钥匙X值”,它会给你回Y.这真的是从一个高的水平一样。它有用于保证重要的可靠性特性(称为ACID,为原子性,一致性,隔离性和持久性)非常强大的功能,并且具有出色的性能,但是从程序员的观点来看,这是一个简单的映射结构。

所以,是的,你可以存储树,但你需要对他们很好的表现决定。你可以去整数密钥(确保它们存储在big-endian字节顺序,因为BDB使用上的按键字典序),只是有一个struct含有儿童整数列表值。你仍然必须手工编写所有的遍历算法,虽然。不知道你有你的分层数据,虽然有什么要求,我们很难给出更具体的建议。

Speedwise,为它做什么的Berkeley DB可能无法获得更快(即,你不会找到太多在那里,速度更快,特别是如果你愿意牺牲一些ACID属性)。它可以让你在你的界面,地图几乎完全控制,所以理论上你很可能建立一个高度优化的结构,为您的特定使用情况。不过,考虑到低层次的接口,如果你正在实施连接,复杂的过滤器的查询,或任何形式在它之上的非凡的查询语言,你必须写一些非常快速的代码和算法,以跟上大关系数据库在那里。

如果您的数据可以通过XML建模(eugh,但我知道有些人喜欢它),还有建立在BDB之上的现有数据库名为BDB XML(也通过了Sleepycat,现在是Oracle的一部分)。这使您可以存储任意XML文档在数据库中,并在数据库中执行快速XPath和XQuery查询。我不认为有一个官方的.NET API来此,但我敢肯定,我遇到一个非官方的.NET绑定到它。

在一般情况下,除非你有一些非常具体的要求,即在那里现有的解决方案不允许(这似乎并不符合您的方案的情况下),我会建议不要使用您自己的数据库(甚至在上面建BDB的),除非你非常娴熟高效的算法和代码优化。如果你存储RDF三元组,就表示该专用数据库,甚至是关系型数据库是不适合他们特别不适应。 BDB XML仍然是一个可行的解决方案了。这是最终的选择,但如果我是你,我会选择在更有趣的问题工作,而无需处理低级别的数据库操作(并因此将使用在现有的包一层薄薄的我的实际RDF存储)。

其他提示

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top