明らかな方法は、Clojure Contrib から JDBC サポートをロードし、マップ/構造体をテーブルに変換する関数を作成することです。これの欠点の 1 つは、あまり柔軟性がないことです。構造を変更すると、DDL の変更が必要になります。これは、DDL 生成を記述する (難しい) か、手動で移行をコーディングする (退屈) ことを意味します。
どのような代替案が存在しますか? 回答は ACID である必要があり、ファイルへのシリアル化などを除外します。
明らかな方法は、Clojure Contrib から JDBC サポートをロードし、マップ/構造体をテーブルに変換する関数を作成することです。これの欠点の 1 つは、あまり柔軟性がないことです。構造を変更すると、DDL の変更が必要になります。これは、DDL 生成を記述する (難しい) か、手動で移行をコーディングする (退屈) ことを意味します。
どのような代替案が存在しますか? 回答は ACID である必要があり、ファイルへのシリアル化などを除外します。
FleetDB は Clojure で実装されたデータベースです。マップ/構造体を操作するための非常に自然な構文があります。たとえば、次を挿入します。
(client ["insert" "accounts" {"id" 1, "owner" "Eve", "credits" 100}])
次に選択します
(client ["select" "accounts" {"where" ["=" "id" 1]}])
依然としてリレーション データベースを使用している Clojure でマップを永続化するための 1 つのオプションは、マップ データを不透明な BLOB に格納することです。レコードを検索する機能が必要な場合は、インデックスを別のテーブルに格納できます。たとえば、FriendFeed が MySQL の上にスキーマレス データを保存する方法を読むことができます - http://bret.appspot.com/entry/how-friendfeed-uses-mysql
もう 1 つのオプションは、Entity-Attribute-Value モデル (EAV) を使用してデータベースにデータを格納することです。ウィキペディアで EAV の詳細を読むことができます (リンクを投稿したいのですが、私は新しいユーザーであり、リンクを 1 つしか投稿できません)。
もう 1 つのオプションは、BerkeleyDB for Java を使用することです。これは、ACID とレコード レベルのロックを提供するネイティブ Java ソリューションです。(リンクを投稿する場合と同じ問題)。
CouchDBのJavaクライアントライブラリを使用しclojure.contrib.json.read/write
ており、私にとってはかなりうまく機能します。ただし、CouchDBの一貫性の保証は、目的に対して十分に強力ではない可能性があります。
Clj-recordは、clojureのアクティブレコードの実装であり、興味があるかもしれません。
Neo4Jなどの Java ベースのグラフ データベースのいずれかを試すことができます。ハッシュマップ インターフェイスをコーディングして、適度に透過的にするのは簡単かもしれません。
MongoDB とそのフレームワーク congomongo (lein: [congomongo "0.1.3-SNAPSHOT"]) は私にとってはうまくいきます。スキーマレス データベースとの相性は抜群で、congomongo との連携は非常に簡単です。MongoDB はすべてのドキュメントに _id フィールドを追加して識別を維持し、clojure-map と mongo-map の間には非常に優れた透過性があります。
https://github.com/somnium/congomongo
編集: 今日は MongoDB を使用しません。トランジットを使用することをお勧めします。バックエンド (Postgres など) がサポートしている場合は JSON を使用し、よりコンパクトなバイナリ エンコーディングが必要な場合は msgpack コーディングを使用します。