Mnesia-テーブルの変更

Mnesiaには、Erlang形式でのデータの保存、複製、トランザクションなど、多くの便利な機能があります。 など しかし、1つの問題があります。テーブル構造を変更する方法ですか?



テーブルを作成するとき、フィールドのリストを指定する必要があります。 テーブルで同じ名前のレコードを使用することは推奨事項に深く入りません。 mnesia:transform_table (フィールドの変換とテーブル定義の置換)を使用してドキュメントで提案されたオプションに従ってフィールドのリストを変更する場合、システムを停止し、テーブルを変換し、アプリケーションコードを変更して新しいタイプで動作し、テストを開始する必要があるようです。

SQLデータベースを見ると、フィールドの追加は基本的な操作です。

システム全体を停止することなく、新しいタイプに切り替えることが重要です。 少なくとも、データベースは継続的に機能する必要があります。



私はムネシアで読み書きを研究しました。 そして、結論はこれです:

Mnesiaは記録中にデータを厳密に制御します。 テーブル構造で宣言されているものだけを記述できます。それ以外の場合はエラーを記述できます。 レコードの名前と要素の数が制御されます-つまり すべて。

ただし、読み取り時に、Mnesiaは現在構成されているフィールドのリストとレコード名を確認せずに、書き込まれた内容を提供します。 また、フィールドのリストは、推奨されていないmnesia形式のtransform_table(Tab、 ignore 、Fildlist)を使用して、実際にレコードを変換することなく変更できます。

ドキュメントから判断すると、このフォームは、テーブルレコードのユーザー変換を目的としています。

すべてがどのように機能するかを見てみましょう。 たとえば、テーブルを作成し、データを書き込み、新しいフィールドを追加して、無視して変換します。

-module(recordtest).

-compile(export_all).

-record(r1 ,{f1,f2}).

-record(r2 ,{f1,f2,f3,f4}).

dbtest()->

mnesia:create_table(r1,[{attributes, record_info(fields, r1)}]).

transform()->

mnesia:transform_table(r1,ignore,record_info(fields, r2), r2).









テストします:



14> mnesia:create_schema([node()]).

18> mnesia:start().

ok

19> recordtest:dbtest().

{atomic,ok}

20> mnesia:dirty_write(r1, {r1,l1,l2}).

ok

21> mnesia:dirty_write(r1, {r1,t1,t2,t3}).

** exception exit: {aborted,{bad_type,{r1,t1,t2,t3}}}

in function mnesia:abort/1

22> mnesia:dirty_write(r1, {r2,l1,l2}).

** exception exit: {aborted,{bad_type,{r2,l1,l2}}}

in function mnesia:abort/1

23> mnesia:dirty_read(r1, l1).

[{r1,l1,l2}]

24> mnesia:dirty_read(r1, l1).

[{r1,l1,l2}]



38> recordtest:transform().

{atomic,ok}

39> mnesia:dirty_read(r1, l1).

[{r1,l1,l2}]

40> mnesia:dirty_write(r1, {r2,l1,l2}).

** exception exit: {aborted,{bad_type,{r2,l1,l2}}}

in function mnesia:abort/1

41> mnesia:dirty_write(r1, {r2,a1,a2,a3,a4}).

ok

49> mnesia:dirty_read(r1, l1).

[{r1,l1,l2}]

50> mnesia:dirty_read(r1, a1).

[{r2,a1,a2,a3,a4}]








これで、テーブルに両方のタイプのレコードがあり、それらを読み取ることができます。 しかし、 mnesia:add_table_index(r1,[l4]).



レコードの4番目のフィールドにインデックスを作成しようとすると、 mnesia:add_table_index(r1,[l4]).





-致命的なエラーを取得し、mnesiaを停止します。 次回このデータベースを起動すると、エラーが再び発生します。 r1.dcmファイルを削除すると役立ちます。その後、mnesiaが起動します。 また、スキーマからテーブル定義を削除する必要があります。

したがって、テーブル内のすべてのレコードがインデックスの仕様に準拠していない限り、インデックスを作成する必要はありません。



上記のすべてに基づいて、それは議論することができます-健忘症テーブルの変換は非常に深刻な問題です。 どうやら、設計段階で、テーブルを変換するためのシステムの動作モードを提供する必要があります。

また、新しいタイプまたは古いタイプのレコードがテーブルに配置されるときに、移行モードで機能する可能性を示します。 新しいタイプのレコードへの移行を完了する(古いタイプのレコードを削除する)方法は、特定のシステムによって異なります。



誰かがMnesiaのテーブルを変更する問題に慣れているなら、それを共有してください。 Mnesiaに関する情報はほとんどありません。



All Articles