分层数据和 Berkeley DB
Posted
技术标签:
【中文标题】分层数据和 Berkeley DB【英文标题】:Hierarhical data and BerkeleyDB 【发布时间】:2009-11-03 18:31:21 【问题描述】:好消息!自 4.8 版以来,BerkeleyDB 具有 c# 接口。 BerkeleyDB 对我来说是一件非常有趣的事情,因为它是非 SQL 的。我知道如果有人想要存储很多键/值对,这是一个很好的工具。而且我知道“可附加”表。我不知道如何使用 BerkeleyDB 存储分层数据。一般适合这个吗?
我想做什么?我想存储 dmoz.org 数据。现在我已将所有数千个 rdfs 导入 mysql db。但我不需要存储过程或其他复杂功能。我想使用 BerkeleyDB 作为我的在线 RSS 阅读器的数据存储。所以类别树中有提要(正如我所说的我从 dmoz 导入的类别。我有很多,以及提要 - 数百万)。而且...我忘记了饲料项目。我也想用 BerkleyDB 存储它们:-)。
看起来我必须手动实现所有关系,,,没关系......但我问的最重要的是速度。我的 BerkeleyDB 解决方案会(可以)比基于 MySQL(或任何 RDBMS)的解决方案更快吗?
【问题讨论】:
【参考方案1】:它很适合,但它可能比您愿意投入的工作量更多。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 存储使用薄层)。
【讨论】:
这个在线订阅阅读器不仅仅是一个大数据存储。它将具有强大的科学背景(文本处理和知识提取)。所以你认为 MySQL 在这种情况下会好吗?【参考方案2】:层次结构可以使用父属性或子属性存储在键值存储中。
如果您希望父节点有 1 个或多个子节点,请在每条记录上使用父属性,并让根节点的父节点 ID 为 0 或其他有意义的值。
如果您希望孩子有 1 个或多个父母,请在每条记录上使用 child 属性。
如果您希望节点可能有多个父节点,并且子节点使用单独的表来存储关系。
这样,您可以通过查询具有特定父节点或子节点的节点来遍历树。
【讨论】:
所以,简而言之,我必须手动实现关系?速度怎么样? 是的,但这是所有 RDBMS 的方式。如果你在关系列上使用索引,它只是一个单一的索引行查找,所以只要你不经常遍历整个层次结构,性能应该是好的。以上是关于分层数据和 Berkeley DB的主要内容,如果未能解决你的问题,请参考以下文章