「10年先行く技術」のデータベースサービス、Datomicを試す

2012.03.11

はじめに

先日、Clojureの作者であるRich Hickey氏のチームが「datomic.com」(でーとみっく)というデータベースサービスをリリースしたそうです。 ここにDatomicのアーキテクチャや概要についての詳細が記述されていますが、

  • 「10年先を行ってる技術」(Takahiro Hozumi氏)
  • 「Datomicはエイリアンの高度なテクノロジーで満たされたUFOだ」(Clojure書籍著者fogus氏)

といわれているように、何やらすごいサービスの様子です。 まだサービス自体は開始してませんが、ローカルで動かすためのツールは使用できるので、これを使って試してみたいと思います。

Datomicについての概要

先程も書いたように、Datomicのアーキテクチャについての詳細はhozumi氏のサイトが非常に詳しく説明しているのでそちらをご覧下さい。 ここではDatomicの概要を簡単に説明します。

Datomicとは?

DatomicとはAmazon RDSやAmazon DynamoDBのような、ホスティングされたデータベースサービスです。 データベースはデータの追加のみが可能で変更不可という特徴をもっています。 また、従来のDBMSとは違ってクエリの処理をアプリケーション側の「Datomic Peer Library」と呼ばれる場所で行うため、DBの負荷が軽減されるそうです。

そして、「Transactor」と呼ばれるトランザクション処理でデータの追加を行い、データ保持形式は、エンティティ、属性、値、時刻からなる、「Datom」という単位で保持します。 なお、DatomicはAmazon DynamoDBをバックエンドとして使用しているようです。

ではdatomicをダウンロードし、ローカルで動かしてみましょう。 現在Datomicを動かすには、付属のREPLから動かすか、JVM上で動作する言語から使用することができます。

動作環境

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.2
  • Java : 1.6.0_26
  • Datomic : 0.1.2678

Datomicを動かしてみる

まずはここからDatomicをダウンロードして解凍します。 この中にはdatomicのライブラリやドキュメント、JavaとClojureのサンプル、REPLなどのツールも付属しています。 datomicのディレクトリへ移動し、REPLを起動してみましょう。

REPLから動かしてみる

script/shellを実行すると、Java形式のREPLが起動し、対話的にDatomic用APIを実行して動作を試すことができます。

%./script/shell                                           
Datomic Java Shell
Type Shell.help(); for help.
datomic %

では、付属ドキュメントのgetting-startedにそってdatomicを少し動かしてみましょう。 まずはDBのURIを定義し、メモリデータベースを作成します。DBを作成するにはPeer.createDatabaseメソッドを使用します。

datomic % uri = "datomic:mem://hello";
<datomic:mem://hello>

datomic % Peer.createDatabase(uri);
<true>

次にデータ(fact)を登録してみましょう。 Peer.connectでコネクションを取得し、fact(データ)を追加します。 Util.listを使用してhello worldという文字列をもったエンティティを追加します。 そして、transactを使用してデータをsubmitしています。

datomic % conn = Peer.connect(uri);
<datomic.peer.LocalConnection@55d4ee7e>

datomic % datom = Util.list("db/add", 
                  Peer.tempid("db.part/user"), 
                  "db/doc",
                  "hello world");
<[db/add, datomic.db.DbId@7ae7a8b9, db/doc, hello world]>
datomic % resp = conn.transact(Util.list(datom));
<#<Future: true>>

登録したデータを検索してみましょう。 Peer.qメソッドを使用して、db/docフィールドがhello worldのデータを検索しています。 値が返ってきているのがわかります。

datomic % db = conn.db();
<datomic.db.Db@38a75c24>

datomic % Peer.q("[:find ?entity :where [?entity :db/d
       oc \"hello world\"]]",db); 
<[[17592186045417]]>

まとめ

今回はとりあえずREPLでDatomicを少しだけ動かしてみました。正直、何がすごくてどんなことができるのかまだサッパリな状況ですが、今後さらに情報もでてくるかと思います。

参考サイトなど