2

好消息!自 4.8 版以来,BerkeleyDB 具有 c# 接口。BerkeleyDB 对我来说是一件非常有趣的事情,因为它是非 SQL 的。我知道如果有人想要存储很多键/值对,这是一个很好的工具。而且我知道“可附加”表。我不知道如何使用 BerkeleyDB 存储分层数据。一般适合这个吗?

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

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

4

2 回答 2

2

它适合那个,但它可能比你愿意投入的工作更多。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 存储使用一个薄层)。

于 2009-11-03T18:44:20.670 回答
1

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

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

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

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

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

于 2009-11-03T18:42:06.913 回答