显而易见的方法是从 Clojure Contrib 加载 JDBC 支持并编写一些函数来将映射/结构转换为表。这样做的一个缺点是它不是很灵活。对结构的更改将需要 DDL 更改。这意味着要么编写 DDL 生成(艰难),要么手动编码迁移(无聊)。
存在哪些替代方案?答案必须是 ACID,排除序列化到文件等。
显而易见的方法是从 Clojure Contrib 加载 JDBC 支持并编写一些函数来将映射/结构转换为表。这样做的一个缺点是它不是很灵活。对结构的更改将需要 DDL 更改。这意味着要么编写 DDL 生成(艰难),要么手动编码迁移(无聊)。
存在哪些替代方案?答案必须是 ACID,排除序列化到文件等。
FleetDB 是一个用 Clojure 实现的数据库。它有一种非常自然的语法来处理地图/结构,例如插入:
(client ["insert" "accounts" {"id" 1, "owner" "Eve", "credits" 100}])
然后选择
(client ["select" "accounts" {"where" ["=" "id" 1]}])
在仍然使用关系数据库的 Clojure 中持久化地图的一种选择是将地图数据存储在不透明的 blob 中。如果您需要搜索记录的能力,您可以将索引存储在单独的表中。例如,您可以阅读 FriendFeed 如何在 MySQL 之上存储无模式数据 - http://bret.appspot.com/entry/how-friendfeed-uses-mysql
另一种选择是使用实体-属性-值模型 (EAV) 在数据库中存储数据。您可以在 Wikipedia 上阅读有关 EAV 的更多信息(我会发布一个链接,但我是新用户,只能发布一个链接)。
另一种选择是使用 BerkeleyDB for Java——它是一种提供 ACID 和记录级别锁定的原生 Java 解决方案。(发布链接同样的问题)。
使用 CouchDB 的 Java 客户端库,clojure.contrib.json.read/write
对我来说效果很好。但是,CouchDB 的一致性保证可能不足以满足您的目的。
Clj-record是您可能感兴趣的 clojure 中活动记录的实现。
您可以尝试其中一种基于 Java 的图形数据库,例如Neo4J。编写 hashmap 接口以使其相当透明可能很容易。
MongoDB 及其框架 congomongo (lein: [congomongo "0.1.3-SNAPSHOT"]) 对我有用。无模式数据库非常棒,而且 congomongo 很容易相处。MongoDB 在每个文档中添加一个 _id-field 以保持其标识,并且 clojure-maps 和 mongo-maps 之间有相当好的透明度。
https://github.com/somnium/congomongo
编辑:我今天不会使用 MongoDB。我建议你使用中转。如果后端(Postgres 等)支持它,我会使用 JSON,如果你想要更紧凑的二进制编码,我会使用 msgpack 编码。