「10年先行く技術」のデータベースサービス、Datomicを試す
はじめに
先日、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を少しだけ動かしてみました。正直、何がすごくてどんなことができるのかまだサッパリな状況ですが、今後さらに情報もでてくるかと思います。
参考サイトなど
- datomic公式: http://datomic.com/
- Clojureの作者が作ったデータベースサービス Datomic.com が凄い: http://hozumi.github.com/2012/03/datomic-ja.html