嵌入式非关系型(nosql)数据存储

时间:2010-01-17 13:24:32

标签: .net sqlite nosql embedded-database

我正在考虑为我的Windows桌面应用程序使用/实现某种嵌入式键值(或文档)存储。我希望能够存储各种类型的数据(GPS轨道就是一个例子),当然也能够查询这些数据。数据量将无法同时加载到内存中。

我正在考虑使用sqlite作为键值存储的存储引擎,类似于y-serial,但是用.NET编写。我还读到了FriendFeed's usage of MySQL to store schema-less data,它是如何将RDBMS用于非关系数据的一个很好的指针。 sqlite似乎是一个很好的选择,因为它的简单性,可移植性和库大小。

我的问题是嵌入式非关系型商店是否还有其他选项?它不需要是可分发的,也不需要支持事务,但它必须可以从.NET访问,并且它的下载大小应该很小。

更新:我发现了一篇名为SQLite as a Key-Value Database 的文章,它将sqlite与Berkeley DB进行了比较,Berkeley DB是一个嵌入式键值存储库。

8 个答案:

答案 0 :(得分:19)

Windows内置嵌入式非关系存储。它被称为ESENT,由多个Windows应用程序使用,包括Active Directory和Windows桌面搜索。

http://blogs.msdn.com/windowssdk/archive/2008/10/23/esent-extensible-storage-engine-api-in-the-windows-sdk.aspx

如果您想要.NET访问,可以在CodePlex上使用ManagedEsent图层。

http://managedesent.codeplex.com/

该项目有一个PersistentDictionary类,它实现了一个实现IDictionary接口的键值存储,但是由数据库支持。

答案 1 :(得分:10)

看看RavenDB。它看起来好像可以嵌入并且没有模式,可以与.NET一起使用

来自网站:

  • 可扩展的基础架构:Raven构建于现有的,经过验证的可扩展基础架构之上
  • 简单的Windows配置:Raven很容易设置并在Windows上作为服务或IIS7网站运行
  • 交易:Raven支持System.Transaction与ACID交易。如果您将数据放入其中,那么该数据将保留在那里
  • Map / Reduce:使用Linq查询轻松定义map / reduce索引
  • .NET客户端API:Raven附带了一个功能齐全的.NET客户端API,可以实现工作单元等等。
  • RESTful:Raven是围绕RESTful API构建的

答案 2 :(得分:5)

我个人会选择使用NHibernate(和Fluent NHibernate)的SQLite。 NHibernate可以为您的类自动生成数据库模式,因此您只需要指定要保留的类,并且使用Fluent NHibernate非常容易。此外,您可以搜索特定对象,而无需将所有数据加载到内存中。

答案 3 :(得分:2)

将KISS原则应用于您的问题我建议您使用文件。

在文件名中是关键。 文件内容是值。 Windows文件夹是索引。

简单,快速,高效,灵活,万无一失(傻瓜智力低下)。

答案 4 :(得分:2)

你能创建一个包含两列的简单sqlite数据库:

==documents==
id|data

,数据将是json数据。

您还可以创建一个密钥表:

==keys==
keyname|keyvalue|id

将在keyname和keyvalue上编入索引,以便快速查找。

单个db文件可以是一个集合,您可以为多个集合创建多个db文件。

你可以使用文件夹作为“dbs”来匹配mongodb的db->集合 - >文档的层次结构

答案 5 :(得分:2)

这是一个老问题,但我想我会添加一个答案,万一有人偶然发现它。我的公司刚刚发布了一个名为Nxdb的.NET平台的开源嵌入式XML数据库。它属于Apache 2.0许可证,并且已在内部开发和使用多年。它基本上是对交叉编译(使用IKVM)版本的BaseX(一个出色的Java XML数据库)以及嵌入式用例和.NET环境的额外功能的绑定。项目页面位于:https://dracorp.assembla.com/spaces/nxdb

XML适用于这种类型的数据存储,因为只要您尝试存储的内容可序列化为文本,您就可以存储复杂的分层树。实际上,如果直接访问数据库,您甚至不必触摸“XML”。它也可以使用强大而完整的查询语言XQuery进行查询。

答案 6 :(得分:1)

感谢您提及y_serial ......更确切地说,它是一个Python模块:

使用SQLite仓库Python对象

“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。“

http://yserial.sourceforge.net

根据我的经验,对于大多数项目来说,SQLite是比大多数数据库(包括PostgresQL和Berkeley DB)更快更可靠的选择 - 当然,它不需要服务器守护程序。

yserial非常容易实现(并且比“文件名是键/文件内容是值”方法快得多; - )

答案 7 :(得分:1)

你可以尝试这个https://github.com/mdsoftware/mData。小,自由,非常不寻常。类似于Lisp的数据查询语言,表达式编译器,高性能二进制序列化,都包括在内。