我正在考虑为我的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是一个嵌入式键值存储库。
答案 0 :(得分:19)
Windows内置嵌入式非关系存储。它被称为ESENT,由多个Windows应用程序使用,包括Active Directory和Windows桌面搜索。
如果您想要.NET访问,可以在CodePlex上使用ManagedEsent图层。
http://managedesent.codeplex.com/
该项目有一个PersistentDictionary类,它实现了一个实现IDictionary接口的键值存储,但是由数据库支持。
答案 1 :(得分:10)
看看RavenDB。它看起来好像可以嵌入并且没有模式,可以与.NET一起使用
来自网站:
答案 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的数据查询语言,表达式编译器,高性能二进制序列化,都包括在内。