9

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

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

4

6 回答 6

10

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

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

然后选择

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

http://fleetdb.org/

于 2011-01-11T14:05:26.153 回答
8

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

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

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

于 2009-06-16T16:45:17.503 回答
6

使用 CouchDB 的 Java 客户端库,clojure.contrib.json.read/write对我来说效果很好。但是,CouchDB 的一致性保证可能不足以满足您的目的。

于 2009-06-16T12:28:10.820 回答
2

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

于 2009-06-15T16:45:40.627 回答
2

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

于 2009-07-08T15:55:07.050 回答
1

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 编码。

于 2011-01-09T01:07:43.893 回答