Cena-DTAの基本原理を簡単に説明します。元は3枚のスライドだったのですが、さらに一枚分を追加して説明します。なお、簡単に説明するため、実際のCenaとの記述とは異なる部分があります。
最初は普通のHTMLフォームです。
<form action="/contact/mod/">
<input type="text" name="id" value="10">
<input type="text" name="name" value="Alan">
</form>
まぁ普通のフォームですよね。
次にCenaのような拡張を施します。
<form action="/cena">
<input name="cena[contact][mod][10][set][name]" value="Alan">
</form>
必要そうな情報を全部nameに配列として入れてしまいました。
これで、次のようなフォームを作成できます。
<form action="/cena">
<input name="cena[contact][mod][10][set][name]" value="Alan">
<input name="cena[contact][new][12][set][name]" value="Taro">
<input name="cena[connect][new][12][set][method]" value="@twitter">
</form>
ひとつのフォームの中で、
複数のデータの修正、追加が可能。たぶん削除もできるはず。
さらに異なるテーブルのデータの修正、追加が可能。
このままだと、Taro君の連絡方法との参照関係がわかりません。
それは、こうやります。
<form action="/cena">
<input name="cena[contact][mod][10][set][name]" value="Alan">
<input name="cena[contact][new][12][set][name]" value="Taro">
<input name="cena[connect][new][12][set][method]" value="@twitter">
<input name="cena[connect][new][12][rel][contact_id]" value="cena.contact.new.12">
</form>
参照については、さらに説明します。
REST((Representational State Transfer)という重要な考え方があります。
詳しくないので英語版Wikipediaの「Guiding principles of the interface」を簡単にまとめて見ます。
次のような統一的なインターフェースを用いる。
この原理をCenaの参照関係の部分に当てはめてみます。
cena.connect.new.12.rel.contact_id = cena.contact.new.12
Identify: cena.connect.new.12
Manipulate: rel.contact_id
Meta Data: cena.contact.new.12
Identify:登録する対象は、新たに追加するTaro君の「@twitter」の連絡先。
Manipulate:操作は、参照関係(rel)項目はcontact_idを設定する。
Meta Data:参照するデータをCenaを使って指定(Identify)する。
このケースで言えば、参照先のcena.contact.new.12が登録されて最終的なIDが確定した後、参照の値を読み込むことで正しく参照関係を維持してデータを登録します。
このように、Cena-DTAでは、すでにマスターDBに存在する・しないにかかわらず、すべてのデータ間の参照を記述することができ、これにより正しく参照データを同期します。