2009年1月17日土曜日

Bentoでリレーション


この前Bento2について書いたとき、「リレーション?なんすかそれ?」という作りだ、と書きましたが、独特ですがリレーション的なこともできないことはないです。
ライブラリやらコレクションを、フォームにドラッグアンドドロップすれば、関連レコードリストと呼ばれる子エンティティを持つことができます。
別のやり方で言うと、フィールドを作成→フィールドの設定→フィールドタイプの選択で「関連レコードリスト」を選択して、オプションの設定で「データソースの選択」です。
データモデルとしては、やっぱりN:Nということになるんでしょうかね。それも両辺、0件を許容しているN:Nです。
しかしこのリレーションは、親にしたエンティティからしか参照できません。
逆向きの参照をするにはもういっこ、子のエンティティからもフィールドの作成をして親のエンティティをデータソースにした関連レコードリストを作ればいいんでしょうが、同じ内容を子側からも入力しないといけないし、バリデーションを作り込むことはできません。
だから基本的には1:Nの関係を想定しているのでしょう。
たとえば僕が関連レコードリストのフィールドを使っているのは、miniDV管理のライブラリです。親のライブラリがminiDV1本1レコードで、フォーム上でその中のチャプター部分を記述する部分が、miniDV明細という名前の別ライブラリの参照になっています。こっちはチャプターひとつが1レコードです。
しかし困ったことに、miniDV明細を直接開いても、それがどの親に紐づけられた明細なのかがわからないんですね。それを管理するには別フィールドを用意して、親のminiDVを指し示すようにしなければならないわけです。このあたり、もうちょっと融通をきかせて、被参照レコードが見えるようになるといいんですが。。

もひとつ例をあげます。映画を観た感想を書くライブラリを作ったとします(僕は作ってませんが)。映画は複数の俳優が出演しています。そんなときどうやってBento2で記述するか。映画のライブラリを作って、俳優のライブラリを作って、映画のライブラリに関連レコードリストとして俳優のライブラリをデータソースに指定すれば、映画のフォームから、その映画に出演している俳優を入力することができます。
でも、その俳優が出演している映画をリスト化するときは、それだけの入力じゃBento2ではできないのです。
Bento2では、これを1回のデータ入力で双方向の抽出を可能にしたい場合、映画をスマートコレクションでつくることになります。まず映画を、ライブラリとして作るのではなく、俳優のフォーム上のチェックボックスの羅列として作ります。そうすると、俳優のフォーム上でどの映画に出ているかがわかります。
映画のほうは、ファイルメニューの中から「新規スマートコレクションを作成」を選択して特定の映画のチェックボックスがONの検索条件を入れて保存して作ります。こうすることで、1回の入力で双方から参照可能なデータが作れる訳です。
しかしこれは、映画を観た感想を書くライブラリを作るにはあまりにも手間がかかるし、映画ひとつ増えるたびにチェックボックスを増やしていくことになるので、あまりいいやり方じゃないですね。となると映画と俳優を逆にして、映画のフォーム上に俳優のチェックボックスをつけていくことになるんですかね。それでも、管理する俳優が増えるたびにチェックボックスが増えるという難点は変わりません。

こうなると1オペレーションで双方向の抽出を可能にする、というのをあきらめて、ふつうに俳優のライブラリと映画のライブラリを作って、お互いに関連レコードリストを持ち合って、それぞれのフォームで関連を入力するダブルオペレーションをしたほうがまだ合理的ということになるんですかね。

おなじことをAccessでN:Nのリレーションを持ったデータベースと入力フォームを作る工数を考えれば、よほどましと言えるのかもしれません。

0 件のコメント: