2016-04-17 11 views
0

私のチームメイトの1人で、データを取得するためのビューをcouchbaseで作成することについての会話がありました。chouchbaseで特定のデータを取得するための特定のビューを作成する

私の提案は、データの特定の検索のためのビューを作成することでした。これは、これがはるかに高速で簡単な方法です。例えば、我々は二つの異なる管理者を持っている:特定のグループの

  • 管理
  • スーパー管理

管理者は、特定のグループからデータを取得し、スーパー管理者は、すべてのからデータを取得しますグループ。

グループのすべてのデータを取得してバックエンドで処理し、グループに属するデータを比較するのではなく、グループに属するデータを取得するようにadminを制限することは理にかなっています。例えば

は複雑な演算のようなものと難しいかもしれない複数のビューを作成するがある場合、彼女は唯一のビューを作成し、グループIDを受け入れ、そのデータ

一方

のすべてを照会Couchbaseのビューを作成します。維持する。

現在、すべてのデータを取得するビューを1つしか使用していないので、LINQを使用してバックエンドの特定のグループの特定のデータを取得することによってデータを処理します。

文書構造:私はそれがのgroupIdで取得したい場合

function (doc, meta) { 
    if (doc.type == "Foo" && !doc.deleted) { 
    emit(meta.id, null); 
    } 
} 

これは私が提案したいサンプルクエリです:

{ 
    "fooReference": "", 
    "groupId": 8, 
    "fooName": "projectTest", 
    "externalId": "PR572", 
    "fooDescription": "OG QGpCst vXAuu", 
    "property5": { 
     "property1": "124", 
     "code": "US", 
     "value": 267206, 
     "start": "2014-10-01T00:00:00Z", 
     "end": "2017-09-30T00:00:00Z" 
    }, 
    "property6": [ 
     "string1", 
     "string2", 
     "string14" 
    ], 
    "property7": [ 
    ], 
    "property8": [ 
    ], 
    "dateAdded": "2016-02-11T07:22:15.2483042Z", 
    "ownerId": 72, 
    "dateUpdated": "2016-02-11T07:22:15.2483042Z", 
    "property9": [ 
     { 
      "id": 72, 
      "type": 0 
     } 
    ], 
    "property10": false, 
    "id": "345", 
    "deleted": false, 
    "type": "Foo", 
    "subtype": "Foo" 
} 

すべてのクエリを取得します。のグループIDを渡すだけです。emit

012私はexternalIdを取得したい場合は
function(doc, meta) { 
    if (doc.type == "Foo" && !doc.deleted) { 
     emit(doc.groupId, doc); 
    } 
} 

私はちょうどexternalIdemit

function(doc, meta) { 
     if (doc.type == "Foo" && !doc.deleted) { 
      emit(doc.externalId, doc); 
     } 
    } 

に、我々は文書を得るための異なる役割を持つ別のクエリを持ってこの方法を渡すために持っている、と我々はちょうどを取得する必要はありません文書のすべてをidで処理し、LINQを使用してバックエンドで処理します。バックエンドでのプロセスそれらを

例:

はgroupIdを取得:

var foos = _fooRepository.GetAll(); 
foos = foos.Where(s => s.GroupId == group.Id).ToList(); 

を外部IDの取得:

var foos = _fooRepository.GetAll(); 
foos = foos.Where(s => s.externalId == foo.externalId).ToList(); 

注:どういうわけか、パフォーマンスが多少あるが特別に私たちにとって重要なユーザーのデータを取得するページをレンダリングするときに使用します。

私の質問は、この種のシナリオに対する最良のアプローチは何ですか?

+0

回答を得るには、文書の構造と質問したいクエリを知る必要があります。一般に、ビューは、特定のドキュメントを効率的に取り出すためのインデックスと、古典的なデータベースビュー、つまりドキュメントの選択と投影を定義します。クエリが開始値と終了値だけ異なる場合(たとえば、1つのグループのスタッフまたはすべてのグループのスタッフ)、1つのビューで実行できます。クエリが構造的に異なる場合(グループのスタッフや学位でスタッフと言う場合)、より多くのクエリが必要になります。 – TAM

+0

@TAM私の質問が更新されました。ドキュメント構造の多くを提供することはできませんが、そのように見えます。 – rpmansion

答えて

2

ライブシステムでプロポーザルをテストしていませんが、クエリの種類ごとにビューを使用すると、必要な要件のテキストブックソリューションのように見えます。異なる条件でデータにアクセスするためのクエリが必要な場合は、各条件セットのビューを定義します。

パフォーマンスの考慮:

スペース:あなたの見解はそれぞれ、選択した各文書のために、放出された値と文書IDを含むインデックスを生成します。これは、全体のデータ量と比較しても問題ありません。私がイメージできる唯一の例外は、非常に限られたハードウェアリソースです。あなたのアプリが、各セントがカウントする車内の組み込みハードウェア上で動作する場合。

ランタイム:データベースの操作の合計は、インデックスを変更する挿入と更新の数とデータのクエリ数と、各クエリで取得されたレコードの数によって異なります。現在、関連する挿入/更新操作の数が問合せの数を超えると、索引によって操作の合計数が増加する可能性があります。ただし、ほとんどのデータベースアプリケーションでは、操作を変更するよりもはるかに多くのクエリが存在するため、インデックスを最新の状態に維持する各操作は、必要なデータを選択する労力を軽減するだけでは足りません。それでも疑わしい場合は、ビューに関連する挿入、更新、およびクエリ操作の数の概算を行うことができます。

別の観点から、いくつかの基準に従ってデータを選択する必要がある場合は、これを実現する方法が2つあります。データベース内、ビューの使用、またはアプリケーション内。アプリケーションでそれを実行するには、2つのパフォーマンス上の問題があります。データをデータベースからアプリケーションに転送する必要があります。アプリケーションには、選択アルゴリズムが含まれている必要があります。データベース。

要約すると、挿入/更新操作がクエリを大幅に超過しない限り、さまざまな方法でデータにアクセスするためのビューを定義する方法があります。

関連する問題