2009-03-03 5 views
3

私はRDBMSの思考プロセスの自由を破るしようとしているが、私はない が私を包むことができますなど、キー値データベースのネストされたアイテムを効率的に照会するためのスキーマの設計方法を教えてください。

を私はアーランとMnesiaを使用していますが、この質問は、CouchDBのような任意のキーと値のデシベルに適用されますこの種のスキーマを効率的に実装する方法については頭を下げてください。

ので、 多くのサブアイテムBのレコードを持っている、

私はUserレコードを持っていると言うと、彼は多くのSubItemAレコードを持っている:私はサブアイテムB.上でクエリを実行する必要が

User 
-SubItem A 
--SubItem B 
... 

がそれを行うには、それが効率的ですそれが のときに入れ子になっていますか?私はちょうどそれを早くするようにそれを正規化する必要がありますか?

データの複製を使用している人がいるので、データは のネストされていて、これはばかげていますか、これは実際には で役に立ちますか?

答えて

3

パフォーマンスはいつですか

すべてのSubItem Bを詳細に調べる必要があり、Bのサイズが辞書の全体的なサイズを支配する必要がある場合、ユーザー辞書のテーブルスキャンは過度のオーバーヘッドではありません。

SubItem Bを照会しているときにすべてのUserおよびSubItem Aデータを読み込まないように、正規化してください。(UserId、SubItemAId、SubItemBIdなど) SubItem Bディクショナリでテーブルが注文されていれば、範囲クエリを実行できます。

User/SubItem Aクエリのパフォーマンスが完全に終了した場合は、データの重複が最後の手段とみなされるため、エラーが発生しやすくなります。

1

CouchDbでは、各SubItemのビューエントリを発行するのは簡単です。これにより、それらのアイテムに非常に迅速にアクセスできます。ビューのエントリに何を入れるかに応じて、おそらく親ドキュメント/サブアイテムにリンクするのに必要な情報を提供することができます。

1

私はMnesiaについてよく分かりません.CouchDBを使い始めたばかりですが、自分のカスタムインデックス(「ビュー」)を生成するので、CouchDBではインデックスを直接作成できますそれらのサブ項目に

例マップ機能:

function(doc) { 
    for(var i in doc.subitems_a) { 
     var subitem_a = doc.subitems_a[i]; 

     for(var j in doc.subitems_a[item_a].subitems_b) { 
      var subitem_b = subitem_a.subitems_b[j]; 

      emit(subitem_b, doc) 
     } 
    } 
} 

効果的にサブアイテムBsのインデックス付きのリストであり、あなたが選択したとして、あなたはそのリストから切り取り、スプライスことができます。

0

実際には、あなたが使用しているデータベースに依存しています。 CouchDBでは、Mnesiaでは何か他の方が優れている一方で、1つはうまく機能します。データを分割して断片化すべきですか?どのような基準でそうするべきですか?データの重複はどれくらいですか?

Jeffery Hantin氏によると、適切な解決策を見つけるためにいくつかの実験と分析が行われる予定だという。それは、そこにある非リレーショナルデータベースのほとんどが、あなたが問題を解決するために必要なツールを提供しているということです。あなたの部分は、それぞれのトレードオフと、他のトレードオフとのトレードオフを考えています。

関連する問題