Squeak 4.4 でODBMSを導入する(Magma)


 DBMS を使った事がある方は多いと思いますが、ほとんどが MySQL などの RDBMS なのではないでしょうか?オブジェクト指向言語を使っていても ORM を介して RDBMS でオブジェクトを永続化する方が一般的ではないかと思います。
 ですが、せっかくオブジェクト指向言語を使っているのですから、DBMS もオブジェクト指向でやってみるのも良いのではないでしょうか?

オブジェクト指向データベース管理システム(ODBMS)

 「オブジェクト指向データベース管理システム」についての詳しい説明は他の資料を参照して頂くとして、ここでは簡単に ODBMS を使う動機などを書いておきます。

 大きなところでは「インピーダンス・ミスマッチ」があげられます。RDBMS を使う場合、データは「オブジェクト」形式として存在していますが、DB へ入出力する際には「表」形式として扱わなければなりません。そのため双方への変換が必要になってしまいます。「どのクラス」を「どのテーブル」に対応させて、「どのプロパティ」を「どのカラム」に対応させるかといったアレです。
 最近ではフレームワークによって、その辺りは自動化されていることも多くて大して苦ではないかもしれませんが、仕様変更のたびにルールを書き換えたり DB に手を入れたりするのはバグが入りそうで何か嫌な感じです。
 ODBMS を利用することで、「インピーダンス・ミスマッチ」からは解放されます。何だか良さそうです。

 Squeak ではフリーな ODBMS 実装として “Magma” があります。今回はこちらを使ってみましょう。

 なお、以下は “Getting started with Magma” を参考にしています。

Magma をインストールする

 SqueakMap からのインストールが簡単です。注意が必要なのは “(head)” ではない最新バージョンを入れる事です。”(head)” には開発中のバージョンが上がっていて不安定なようです。ちなみに現在は “SqueakSource3” で管理されているようです。
スクリーンショット 2014-02-25 21.25.58
 対象バージョン(“server”を選択してください)を選択して右クリックメニューから “Install” をクリックするとダウンロード、インストールが始まりますので、終了を待ちます。

データベースを作成する

 次のようにして DB 名とルートオブジェクトを指定することで DB を作成することが出来ます。

MagmaRepositoryController
	create: 'mydb'
	root: Dictionary new.

 DB は “file list” で確認することが出来ます。
スクリーンショット 2014-02-25 21.33.53

セッションを開く

 今回は簡単のためにサーバを立てずにシングルユーザモードで使う事にします。次のようにしてローカル DB へのセッションオブジェクトを取得します。

session := MagmaSession openLocal: 'mydb'.

 セッションが確立出来たら #root を使ってルートオブジェクトを取得する事が出来ます。

session root. "a Dictionary()"

トランザクション処理

 あとは普通にこの Dictionary インスタンスに放り込んでいけば良いのですが、実際のアプリケーションではトランザクション処理をすることが多いと思います。トランザクション処理を行いたい場合は対象の処理をブロックにして #commit: を使うと実現出来ます。

session commit: [
	session root
		at: 'one' put: 1;
		at: 'two' put: 2.
	]
session root at: 'one' "1"

セッションを閉じる

 セッションを閉じる時は #disconnectAndClose を送ります。

session disconnectAndClose

データベースを削除する

 もし DB を削除したい場合は次のようにします。

MagmaRepositoryController delete: 'mydb'

 すると本当に削除して良いのかを確認するノーティファイアが開くので “Proceed” をクリックすると削除されます。大切な DB を削除しないよう気をつけてください。
スクリーンショット 2014-03-01 0.19.38

 さて、 DB の作成、書き込み、DB の削除まで一連の操作を見てきました。あまり DB との境目を感じる事が無かったのではないでしょうか?これがオブジェクト指向プログラミング言語と ODBMS を組み合わせる大きなメリットではないでしょうか?

 一方で分かりやすいデメリットとしてはアプリケーションのオブジェクト構造がそのまま永続化されるため、そのアプリケーション以外では使いやすいとは言えない事が多いようです。例えば、あるアプリケーションが残したデータを KPI 分析で使う、などの場合です。
 また RDB と SQL は集合論という数学の裏付けがしっかりとしているので、数学を応用した操作が出来ますが、 ODB では数学的な裏付けが弱い点がデメリットの一つと言えるかもしれません。

 いずれにせよ様々なシステムを使っておくのは良い経験になると思いますので、 ODBMS に触れた事のない方は触ってみるのはいかがでしょうか?