2010-01-17 75 views
21

我在考虑使用/实施某种形式的嵌入式键值(或文件)店为我的Windows桌面应用程序。我希望能够存储各种类型的数据(GPS轨道将是一个例子),当然也能够查询这些数据。数据量可能不会全部同时加载到内存中。嵌入式非关系型(NoSQL的)数据存储

我考虑使用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是嵌入式键值存储库。

回答

5

个人而言,我会去的SQLite与NHibernate(和流利NHibernate的)。 NHibernate可以为你的类自动生成数据库模式,所以你只需要指定你想要保留的类,这对于Fluent NHibernate来说非常简单。此外,您可以搜索特定的对象,而无需将所有数据加载到内存。

+0

但他想要一个无模式存储.... – 2010-01-17 15:46:37

+0

阿斯特是正确的:我想避免关系模型。我希望能够存储几乎任何类型的数据,而无需首先为其准备数据库模式。另外,如果数据结构稍后改变,那么拥有严格的关系模型可能会产生问题 - 我需要为存储中的现有数据编写SQL更改脚本。 – 2010-01-17 16:03:44

+1

我知道他在找什么,但像NHibernate这样的工具在模式生成中几乎完全隐藏了关系方面。您不需要定义任何模式,只需要为您定义类的映射(这对Fluent NHibernate来说非常简单),当您的类更改时,您需要在任何持久性策略中进行某种更新。 – 2010-01-17 16:25:53

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/

该项目具有实现key-value存储实现IDictionary接口PersistentDictionary类,而是由数据库支持。

+0

@Laurion,我见过ESENT,最初很兴奋。唯一的问题是它只有Windows(想想Mono + Linux/Mac)。 – 2010-02-23 12:09:07

2

应用KISS原则,以你的问题,我建议你使用的文件。

由于文件名是关键。 文件内容是值。 Windows文件夹是索引。

简单,快捷,高效,灵活,和万无一失(提供愚者低智商)。

+0

不错的方法,尽管我觉得使用文件来存储值对于简单的值(例如单个整数)来说有点过分了。 – 2010-02-23 12:06:28

+0

这个问题意味着被存储的内容可能很大(文档/太多的数据要加载到内存中)。文件方法的优点之一是,您可以免费获得一组很好的Stream处理类,这在处理大块数据时非常有用,并且比将数据分割成任意nMB blob并将其存储在数据库。 – 2010-02-24 02:26:15

+2

是的。那么文件系统的物理限制呢?当记录数量达到100.000时,这种商店会如何运作?另外:当我谈到“太多的数据”时,我的意思是_whole_数据库 - 我提到这个以避免像对象树序列化和类似的问题。 – 2010-02-24 17:28:26

1

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

使用SQLite仓库Python对象

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

http://yserial.sourceforge.net

根据我的经验,SQLite是比大多数数据库(包括PostgreSQL与Berkeley DB),为广大的项目更快,更可靠的选择 - 当然,它并不需要一个服务器守护程序。

yserial是很容易实现(和远快于“文件名是键/文件内容是值”的方法;-)

+0

是的,我非常喜欢y-serial的方法,尤其是因为它使用了sqlite。保持良好的工作!也许当我从其他项目中获得一些时间时,我会尝试在C#中执行类似的操作:) – 2010-03-03 18:17:10

2

你可以创建一个有两列一个简单的SQLite数据库:

==documents== 
id|data 

并且数据将是json数据。

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

==keys== 
keyname|keyvalue|id 

,将键名和键值,以便快速查找索引。

单个数据库文件可能是一个集合,您可以为多个集合创建多个数据库文件。

你可以使用文件夹为“DBS”匹配DB->收藏 - >文件

+0

只需注意:您将创建一个模板sqlite数据库文件,并随时将其复制以创建新集合。 如果有人想创建一个PHP安装程序来处理这个问题并开放源代码,请告诉我。我认为这会很好,但从来没有打算自己做。 – RobKohr 2010-04-02 00:01:32

+0

你的建议正朝着y系列如何做的方向发展。你有看到它吗? http://yserial.sourceforge.net/ – 2010-04-02 15:57:56

+0

不,但我正在寻找一个php解决方案。 – RobKohr 2010-04-02 22:11:23

10

的MongoDB的层次在RavenDB看看。看起来好像它可以嵌入和无模式是与.NET

作品从网站:

  • 扩展的基础架构:乌鸦建立在现有的顶部,探明和可扩展的基础设施
  • 简单的Windows配置:Raven很容易安装并在windows上以服务或IIS7网站的形式运行
  • 交易:Raven支持System.Transaction与ACID交易。如果你把数据在里面,这些数据是要呆在那里
  • 的Map/Reduce:轻松定义的map/reduce指标与LINQ查询
  • .NET客户端API:乌鸦配备了功能齐全的.NET客户端API,它实现工作单位等等
  • REST风格:乌鸦是围绕一个RESTful API
2

这是一个老问题,建,但我想我要补充的情况下,任何人在其上跌倒的答案。我的公司刚刚发布了一个名为Nxdb的.NET平台的开源嵌入式XML数据库。它在Apache 2.0许可下,并且在内部开发和使用了好几年。它基本上是绑定到交叉编译(使用IKVM)版本的BaseX(一个梦幻般的Java XML数据库)以及嵌入式用例和.NET环境的额外功能。项目页面在这里:https://dracorp.assembla.com/spaces/nxdb

XML适用于这种类型的数据存储,因为只要您试图存储的内容可序列化为文本,您就可以存储复杂的分层树。事实上,如果你直接访问数据库,你甚至不需要碰“XML”。它也可以用XQuery查询,这是一个功能强大且完整的查询语言。

1

您可以试试这个https://github.com/mdsoftware/mData。小,自由和很不寻常。Lisp-like数据查询语言,表达式编译器,高性能二进制序列化,全部包括在内。