在Clojure中持久保存地图/结构的最简单方法是什么?

时间:2009-06-15 10:10:24

标签: clojure persistence

显而易见的方法是从Clojure Contrib加载JDBC支持并编写一些函数将map / struct转换为表。这样做的一个缺点是它不是很灵活;对结构的更改将需要更改DDL。这意味着编写DDL生成(艰难)或手动编码迁移(无聊)。

有哪些替代方案?答案必须是ACID,排除序列化到文件等等。

6 个答案:

答案 0 :(得分:10)

FleetDB是一个在Clojure中实现的数据库。它具有处理地图/结构的非常自然的语法,例如插入:

(client ["insert" "accounts" {"id" 1, "owner" "Eve", "credits" 100}])

然后选择

(client ["select" "accounts" {"where" ["=" "id" 1]}])

http://fleetdb.org/

答案 1 :(得分:8)

在Clojure中持久保存仍使用关系数据库的地图的一个选项是将地图数据存储在不透明的blob中。如果您需要能够搜索记录,则可以将索引存储在单独的表中。例如,您可以阅读FriendFeed如何在MySQL上存储无模式数据 - http://bret.appspot.com/entry/how-friendfeed-uses-mysql

另一种选择是使用实体 - 属性 - 值模型(EAV)将数据存储在数据库中。你可以在维基百科上阅读更多关于EAV的信息(我发布一个链接,但我是一个新用户,只能发布一个链接)。

另一种选择是使用BerkeleyDB for Java - 它是提供ACID和记录级别锁定的本机Java解决方案。 (发布链接也有同样的问题。)

答案 2 :(得分:6)

使用CouchDB的Java客户端库和clojure.contrib.json.read/write对我来说效果很好。但是,CouchDB的一致性保证可能不够强大,无法用于您的目的。

答案 3 :(得分:2)

Clj-record是您可能感兴趣的clojure中的活动记录的实现。

答案 4 :(得分:2)

您可以尝试使用其中一个基于Java的图形数据库,例如Neo4J。编写一个hashmap接口可能很容易使其合理透明。

答案 5 :(得分:1)

MongoDB和它的框架congomongo(lein:[congomongo“0.1.3-SNAPSHOT”])适合我。无模式数据库令人难以置信,congomongo很容易相处。 MongoDB在每个文档中都添加了一个_id-field来识别它,并且clojure-maps和mongo-maps之间有很好的透明度。

https://github.com/somnium/congomongo

编辑:我今天不会使用MongoDB。我建议你使用transit。如果后端(Postgres等)支持JSON或msgpack编码,我会使用JSON,如果你想要更紧凑的二进制编码。