2

特定のレコードをデータベースから削除する必要がある時間を含む整数キー (タイムスタンプ) を持つテーブルがあります。このテーブルから、有効期限が現在よりも短いレコードを取得して削除するクリーニング クエリもあります。

Erlang のドキュメントによると、テーブル型には 、 、 、および の 4 つのタイプsetordered_setありbagますduplicate_bag

  • setハッシュテーブルを使用して実装されているため、読み取りには O(1) 時間の複雑さがかかります。
  • ordered_setツリーを使用して実装されているため、読み取りには O(log(n)) 時間の複雑さがかかりますが、結果の間隔でより適切に機能します。
  • bag実装に関する情報は見つかりませんでした。

ordered_set理想的に思えますが、2 つのレコードが同じタイムスタンプを持つ可能性があるため、使用できません。質問は次のとおりです。

テーブルはどのようにbag実装されており、結果の間隔を照会するのに適していますか? そうでない場合、どうすれば " ordered_bag" 機能を取得できますか?

4

2 に答える 2

5

Mnesiaは、他のテーブル タイプと同様に と を使用して実装されます [1 ] bag。また、Mnesia はテーブルをサポートしていません。ドキュメント [2] から確認できます。したがって、Mnesia はハッシュ テーブルとして実装されており、ハッシュ テーブルとして実装されているため、ルックアップ時間が一定であると結論付けることができます [3]。[4] では、Mnesia では と がハッシュ テーブルとして実装されているとも述べています。ETSDETSduplicate_bagbagETSDETS bagsetbag

  1. Erlangを学ぶ
  2. Erlang -- mnesia:create_table/2
  3. Erlang プログラミング Francecso Cesarini と Simon Thompson 著、Ch.10
  4. Erlang and OTP in Action by Martin Logan、Eric Merritt、Richard Carlsson、Ch.9

残りの質問について:

いいえ、bag結果の間隔を照会するのは得意ではありません。テーブルから間隔を取得するには、bagそれを完全にトラバースする必要があります。それには2つの可能な決定があると思います。

まずordered_set、 @niahoo が提案したように、追加のテーブルを使用して順序を維持できます。したがって、間隔内にあるすべてのタイムスタンプを効率的にクエリし、対応するエントリをbagテーブルから削除できます。これも効率的です。これは、この時点ですべてのキーがわかっているためです。

次にordered_set、を 使用できます{timestamp, [values]}。これには、単一のエントリを挿入および削除するための追加の手動ジョブが必要になりますが、timestamp.

于 2013-09-30T10:38:59.660 に答える