在Clojure中持久化映射/结构的最简单方法是什么?

在Clojure中持久化映射/结构的最简单方法是什么?,clojure,persistence,Clojure,Persistence,显而易见的方法是从Clojure Contrib加载JDBC支持,并编写一些函数将映射/结构转换为表。这样做的一个缺点是它不是很灵活;对结构的更改将需要DDL更改。这意味着要么编写DDL生成(困难),要么手工编写迁移(无聊) 还有什么替代方案?答案必须是酸性的,排除了序列化到文件等。是clojure中的活动记录实现,您可能会感兴趣。使用CouchDB的Java客户端库和clojure.contrib.json.read/write对我来说相当不错。不过,CouchDB的一致性保证可能不足以满足您

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


还有什么替代方案?答案必须是酸性的,排除了序列化到文件等。

是clojure中的活动记录实现,您可能会感兴趣。

使用CouchDB的Java客户端库和
clojure.contrib.json.read/write
对我来说相当不错。不过,CouchDB的一致性保证可能不足以满足您的需要。

在仍然使用关系数据库的Clojure中持久化映射的一个选项是将映射数据存储在不透明的blob中。如果需要搜索记录的功能,可以将索引存储在单独的表中。例如,您可以了解FriendFeed如何在MySQL上存储无模式数据-

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


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

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

MongoDB及其框架congomongo(lein:[congomongo“0.1.3-SNAPSHOT”])适合我。使用无模式数据库非常好,而且congomongo非常容易相处。MongoDB在每个文档中添加了一个_id-field来保持它的标识,clojure映射和mongo映射之间有很好的透明度


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

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

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

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

有些人将Neo4j与Clojure一起使用,看看这里有没有不同的包装器实现:+1,希望你能很快开始使用更多的链接:-)过去3年没有提交,看起来.org域有了新的所有权。更新:我今天不会使用MongoDB。