2016-05-27 11 views
1

私は現在、CouchDBが私のユースケースに適しているかどうかを判断しようとしています。文書のCouchDBでの複数の結合

最初のセット(のは、企業、それらを呼びましょう)::

{ 
    "_id" : 1, 
    "name" : "Foo" 
} 

{ 
    "_id" : 2, 
    "name" : "Bar" 
} 

{ 
    "_id" : 3, 
    "name" : "Baz" 
} 

文書の第二セット(のは、プロジェクトにそれらを呼びましょう):

{ 
    "_id" : 4, 
    "name" : "FooProject1", 
    "company" : 1 
} 

{ 
    "_id" : 5, 
    "name" : "FooProject2", 
    "company" : 1 
} 
... 
{ 
    "_id" : 100, 
    "name" : "BazProject2", 
    "company" : 3 
}  

第三に、私は次のような状況があります一連の文書(インシデントと呼ぶ):

{ 
    "_id" : "300", 
    "project" : 4, 
    "description" : "...", 
    "cost" : 200 
} 

{ 
    "_id" : "301", 
    "project" : 4, 
    "description" : "...", 
    "cost" : 400 
} 

{ 
    "_id" : "302", 
    "project" : 4, 
    "description" : "...", 
    "cost" : 500 
} 
    ... 

したがって、すべての会社複数のインシデントを持つことができます。私がデータをモデル化する理由の1つは、主にSQLのバックグラウンドから来ているため、モデリングが完全に不適切である可能性があるということです。 2番目の理由は、couchdbが提供するREST-APIを使用するだけで、簡単に新しいインシデントを追加したいということです。したがって、インシデントは単一の文書でなければなりません。

しかし、今私は各社の総コストを計算できるようにするための見解を得たいと考えています。 map-reduceとリンクされたドキュメントを使ってビューを簡単に定義することができます。これはプロジェクトごとの合計金額です。しかし、私がプロジェクトレベルにいると、私はそれ以上会社のレベルには達しません。

couchDbを使用するとこれはまったく可能ですか?この種の集計データは、map-reduceの完璧な使用例のように聞こえる。 SQLでは3つのテーブルの結合を行いますが、couchDbのように見えるのは2つのテーブルの結合だけです。

+0

CouchDBで結合を行うことはできません(少なくとも、そうすべきではありません)。リスト関数を使用して隣接行をマージ(照合)できますが、それ以外の場合はパフォーマンスが低下します。 – OrangeDog

答えて

2

前述したように、CouchDbでは結合を行うことはできませんが、これに限定されるものではありません。これは、あなたの問題について考え、異なるアプローチをとるための招待です。 IncidentReference構成:CouchDBの中でこれを行うための正しい方法は、たとえばと呼ばれるデータ構造を定義することです

  • プロジェクトID
  • そして企業ID

あなたのデータは次のようになりその方法:

{ 
    "_id" : "301", 
    "project" : 4, 
    "description" : "...", 
    "cost" : 400, 
    "reference" : { 
     "projectId" : 1, 
     "companyId" : 2 
    } 
} 

これは問題ありません。これを済ませたら、Map/Reduceで遊んで簡単に何でもできます。一般に、データを照会する方法について考える必要があります。

+0

私がこれを理解する限り、SQLの観点からは、どんな種類の正規化も本当に放棄しなければなりませんか?このインシデントリファレンスでは、projectIdとcompanyIdの両方が参照に格納されているので、プロジェクトにはすでにその会社(重複データ)が含まれています。だから、このデータが矛盾しないようにする最良の方法は何ですか? – LiKao

+1

一般的には、非正規化には注意が必要です。たとえば、顧客名を非正規化し、この名前が変更された場合、管理が難しくなります。ただし、必要に応じて他のエンティティと同じくらいの参照(識別子)を持つことは、通常は安全です。それについて考えると、これらの参照が時代遅れになることは非常にまれです(このプロジェクトには、もはやこの案件がどのように属していないのでしょうか?これらの参照がドキュメントのIDの定義に参加していることを確認してください。IDは変更されません:) – reddy