键值存储和完整的SQL数据库之间有什么关系吗?

时间:2011-02-18 15:15:19

标签: database language-agnostic

我经常遇到这个问题,我有简单(POD)对象的数组,需要将它保存到磁盘,按一列搜索内容并检索它。

我们以一个简单的缓存为例:

id: Integer
expires: Date
query: String
result: String

常见操作是保存对象(#1),通过id(#2)检索对象并删除特定日期(#3)之后的所有内容,而不使用必须在运行时解析的DSL(#4) )。
由于我知道我的数据格式,因此我不需要任何支持来存储任意文档(#5)。

这应该足够常见,导致大量的图书馆正在这样做,但我所看到的只是键值存储,如bdb,tokyocabinet等(由于#3而无法正常工作) ,完整的SQL数据库,包括SQLite,MySQL等(#4),以及完全无模式的数据库,如CouchDB,MongoDB等(#5)。 将其存储为普通的CSV / XML / JSON工作得相当好,但不能很好地完成#2和#3。

我正在寻找类似Boost's Multi-Index(但使用磁盘作为存储)或Squeryl但使用本机后端而不是美化的DSL-to-SQL-Compiler的内容。
有没有类似的东西,或者我该死的要么手工解析CSV还是编写大量的样板文件才能使用SQL数据库的好处?

2 个答案:

答案 0 :(得分:1)

这听起来像是通常在普通的SQL数据库中完成的事情。如果您创建一个好的工厂方法来保存和加载这些对象,那么每个工厂(如果您有多个对象类型)只需要实现两个查询(保存和加载),可能需要三分之一进行更新。如果您的对象直接映射到表记录,您甚至可以创建一个基本对象,它只将属性映射到字段名称并为您生成这些查询。由于几乎每种语言都有几乎所有数据库的库,因此即使您不使用许多语言支持的众多DBO功能之一,也可以在一天内完成设置。一个简单的实现可能只需要不到200行代码,并且可能已经比你现在用CSV做的更强大了。

答案 1 :(得分:1)

MongoDB(可能还有其他noSQL数据库)允许您在表上拥有多个索引。但即使使用键/值类型系统也没有什么可以阻止你使用日期作为键创建第二个表,并将数据表中的键作为有效负载并将其用作索引。

但是,除非你有非常具体的理由使用非关系数据库,否则我建议坚持使用关系数据库 - 迟早你将不得不开始调试数据/分析模式,处理更复杂的数据数据模型等。