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

Rob*_*ell 8 persistence clojure

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

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

Mar*_*rkc 10

FleetDB是一个在Clojure中实现的数据库.它有一个非常自然的语法来处理map/structs,例如插入:

(client ["insert" "accounts" {"id" 1, "owner" "Eve", "credits" 100}])
Run Code Online (Sandbox Code Playgroud)

然后选择

(client ["select" "accounts" {"where" ["=" "id" 1]}])
Run Code Online (Sandbox Code Playgroud)

http://fleetdb.org/


Cos*_*ean 8

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

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

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


pmf*_*pmf 6

使用CouchDB的Java客户端库并且clojure.contrib.json.read/write对我来说工作得相当好.但是,CouchDB的一致性保证可能不够强大,无法满足您的需求.