4

私は Mnesia のドキュメントと 3 つの有名な Erlang の本に目を通しました。単一列のプライマリ インデックスとセカンダリ インデックスのみを作成して使用できるようです。それとも、例がカバーしているだけなのでしょうか? 各列に個別のインデックスを作成した場合、Mnesia は複数列のキー インデックス検索をシミュレートするためにそれらをインテリジェントに使用できますか? もしそうなら、パフォーマンスは単純なテーブルスキャンよりもはるかに優れていますか?

複数列のインデックス作成が Mnesia でサポートされていない場合、そのネイティブ dbms を考えると、Erlang でこの機能をシミュレートした人がいます。

2 番目の質問: 制約 (参照、チェック)、トリガー、およびイベントベースの通知をシミュレートするのはどうですか?

4

2 に答える 2

5

{X, Y}1 つの方法は、キーを持つ「列」に直接格納することです。これにより、構造のクエリで高速に検索でき{_, _}ますが、タプル内の値の 1 つしか知らない場合は検索が遅くなります (デフォルトでは、テーブルはハッシュ テーブルです)。

他の DBMS の要望について: Mnesia は、アプリケーションを作成する際の Ericsson 開発者のニーズを満たすために構築されたものほど、従来のデータベースを置き換えるために構築されたものではありません。したがって、それが目的である場合は、従来のデータベースにデータを保存する方がよい場合があります。

ただし、必要に応じて、mnesia の周りのコードを使用して機能を追加できる場合があります。

于 2011-01-01T00:04:37.557 に答える
1

Mnesia には、イベント ベースの通知があります。mnesia イベントをサブスクライブするプロセス (gen_server) を持つことが可能です。これらのイベントは、テーブル イベント、システム イベントなどに分類されます。イベントに関する部分で mnesia のドキュメントを読んでください。実際には、プロセスが mnesia イベント ハンドラーを呼び出してイベントを報告することは可能ですmnesia:report_event(Event)。mnesia イベントに登録されているすべてのプロセスは、このメッセージを受け取ります。Mnesia は、テーブル上のすべてのトランザクションに関するリアルタイムの情報をサブスクライブされたプロセスに報告します。読み取り、書き込み、または削除トランザクションがあり、そのループ内のプロセスは、関心のあるイベントのタイプにパターン マッチできます。詳細なテーブル イベントと単純なテーブル イベントがあります。私は個人的にイベントが非常に有用であると感じました。ドキュメントから詳細を取得できるはずです。

イベントについて。現在、mnesia テーブルには同じタイプのレコードが格納されています。この情報は、 を呼び出すことでアクセスできますmnesia:table_info(Table_name::atom(),attributes)。mnesia テーブルにインデックスを適用する場合、最初のレコード フィールド (通常は「主キー」と呼ばれる) でない限り、これらの属性から任意のフィールドを受け入れます。理由の数々。以下のコードスニペットを検討してください

-record(employee,{id,first_name,other_name,sex,age,job}).

インストール (ノード)->
  mnesia:create_schema(ノード),
  mnesia:start(),
  mnesia:create_table(employee,[{index,[age,sex,first_name,job]}, 
{attributes,record_info(fields,employee)}]), mnesia:stop(), わかった。

私があなたの質問をよく理解していれば、テーブルの従業員には列があり、年齢、性別、名、その他の名前、および仕事が索引付けされていると言えますmnesia:index_read/3 or mnesia:index_match_object/2 or mnesia:index_match_object/4。幸運を

/joshmuza@gmail.com

于 2011-01-13T17:00:09.377 に答える