21

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

我正在考虑使用 sqlite 作为键值存储的存储引擎,类似于y-serial,但用 .NET 编写。我还阅读了有关FriendFeed 使用 MySQL 存储无模式数据的信息,这是关于如何将 RDBMS 用于非关系数据的一个很好的指导。sqlite 似乎是一个不错的选择,因为它的简单性、可移植性和库大小。

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

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

4

8 回答 8

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 接口,但由数据库支持。

于 2010-02-23T00:59:02.373 回答
10

看看RavenDB。它看起来好像可以嵌入并且是无模式的并且可以与 .NET 一起使用

从网站:

  • 可扩展的基础设施:Raven 建立在现有的、经过验证的、可扩展的基础设施之上
  • 简单的 Windows 配置:Raven 易于设置并在 Windows 上作为服务或 IIS7 网站运行
  • 事务性:Raven 支持带有 ACID 事务的 System.Transaction。如果您将数据放入其中,则该数据将保留在那里
  • Map/Reduce:使用 Linq 查询轻松定义 map/reduce 索引
  • .NET 客户端 API:Raven 带有一个功能齐全的 .NET 客户端 API,它实现了工作单元等等
  • RESTful:Raven 是围绕 RESTful API 构建的
于 2010-05-30T06:29:27.077 回答
5

就我个人而言,我会选择使用 NHibernate(和 Fluent NHibernate)的 SQLite。NHibernate 可以为你的类自动生成数据库模式,所以你只需要指定你想要持久化的类,这对于 Fluent NHibernate 来说非常容易。此外,您可以搜索特定对象,而无需将所有数据加载到内存中。

于 2010-01-17T15:20:07.670 回答
2

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

==documents==
id|data

和数据将是 json 数据。

您还可以创建一个键表,该表将是:

==keys==
keyname|keyvalue|id

这将在键名和键值上建立索引以进行快速查找。

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

您可以将文件夹用作“dbs”来匹配 mongodb 的 db->collection->document 层次结构

于 2010-04-01T23:59:41.900 回答
2

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

正如文件名是关键。文件内容就是值。Windows 文件夹是索引。

简单、快速、高效、灵活、万无一失(前提是傻子智商低)。

于 2010-02-23T02:45:59.390 回答
2

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

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

于 2012-03-13T16:35:29.473 回答
1

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

于 2013-05-20T12:10:54.267 回答
1

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

使用 SQLite 存储 Python 对象

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

http://yserial.sourceforge.net

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

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

于 2010-03-03T17:11:53.857 回答