Mnesiaテーブル
データベーステーブルの定義も1回の操作だけで行います。この操作はスキーマのコピーがあるノードのいずれかで実行します。mnesia:create_table
関数を使用して、テーブルの構造を設計したり、重要なテーブル属性を多数設定できます。次の例では、table1およびtable2を作成し、データを設定しています。
(first@charlie)3> test:start_tables(). =INFO REPORT==== 4-Jan-2010::16:22:27 === application: mnesia exited: stopped type: temporary stopped
second@deltaでもtest.erlファイルをコンパイルしていれば、deltaでも上記の関数を実行できます。以下のコードを参照して、前述の関数mnesia:create_table
がどのように使用されるかを確認してください。
mnesia:create_table(table1, [ {type, set}, {attributes, record_info(fields, table1)}, {disc_copies, [first@charlie, second@delta]} ])
ご覧のように、この関数は、テーブルの特性を決定するタプル{key, value}
のリストを引数として取ります。この場合は、table1という名前の「set」テーブルを作成します。このテーブルの列は、ファイルの最初の方にあるrecord命令で以下のように定義されています。
-record(table1, {table1_id, name, color, number}).
disc_copies
キーに注目してください。このキーは、テーブルのハードディスクコピーを作成する場所を指定しています。これは、Mnesiaデータベースの冗長性をテーブルレベルで調整できるということを意味します。この場合は、table1のコピーをノードfirst@charlieとsecond@deltaのハードディスク上に作成します。次のセクションでは、この関数がどのように動作するかを説明します。
Mnesiaノードをテストする
second@deltaノードで以下を実行します。
(second@delta)5> test:select(). [{table1,1,"record1","brown",1724}, {table1,2,"record2","orange",2367}, {table1,3,"record3","red",7834}]
次に、シェルから抜けて、second@deltaノードをシャットダウンします。first@charlieノードで、table1に新規レコードを挿入します。
(first@charlie)6> test:insert(). ok (first@charlie)7> test:select(). [{table1,1,"record1","brown",1724}, {table1,2,"record2","orange",2367}, {table1,3,"record3","red",7834}, {table1,4,"record4","orange",8888}]
今度は、second@deltaノードに再度電源を投入し、mnesia:start()
でMnesiaエンジンを起動します。次に、table1のレコードを抽出します。
(second@delta)2> test:select(). [{table1,1,"record1","brown",1724}, {table1,2,"record2","orange",2367}, {table1,3,"record3","red",7834}, {table1,4,"record4","orange",8888}]
second@deltaがダウンしていたときにfirst@charlieノードに挿入されたレコードが、table1のコピーにも挿入されています。これは、second@deltaのスキーマ自体が、ブート中にfirst@charlieのスキーマと透過的に同期されたことを意味します。
ram_copies
キーまたはdisc_only_copies
キーがテーブルに対して持つ意味は推測できるでしょう。テーブルのRAMコピーをノード上に保持することは、パフォーマンス面で優れたやり方です。しかし、この方法では当然、データを永続的に保持することはできません。ここで理解すべき重要なポイントは、Mnesiaの独創的なテーブルミラーリング機能です。