2009-06-15 57 views
7

显而易见的方法是从Clojure Contrib加载JDBC支持并编写一些函数将地图/结构转换为表格。这样做的一个缺点是它不够灵活。对结构的更改将需要DDL更改。这意味着要么编写DDL代(难)或手工编码迁移(无聊)。在Clojure中保存地图/结构体的最简单方法是什么?

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

回答

5

使用CouchDB的Java客户端库和clojure.contrib.json.read/write对我来说工作得很好。不过,CouchDB的一致性保证可能不足以满足您的需求。

2

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

7

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

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

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

+1

+1,这样希望您可以开始使用更多的链接不久的某个时候:-) – mikera 2011-01-09 17:53:41

2

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

+0

有一些人使用的Neo4j使用Clojure,有在这里看看不同的包装器实现:http://wiki.neo4j.org/content/Clojure – nawroth 2009-08-02 10:57:52

1

MongoDB和它的框架congomongo(lein:[congomongo“0.1.3-SNAPSHOT”))适合我。对于无模式数据库来说,这非常棒,而且congomongo很容易相处。 MongoDB在每个文档中都添加了一个_id字段以确保它的识别,并且clojure-maps和mongo-maps之间有相当好的透明度。

https://github.com/somnium/congomongo

9

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

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

然后选择

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

http://fleetdb.org/

+1

过去3年没有提交,看起来像.org域拥有新的所有权。 https://github.com/mmcgrana/fleetdb – Joanis 2014-05-04 01:33:48

相关问题