2012-02-24 5 views
1

私は平らな文書を格納するために1つのDBを使用し、添付ファイルだけを格納するためにもう1つのDBを使用しています。しかし、私は平文のDBに添付IDを保存しています。どのようにRDBMSのような2つのデータベースを結合操作を実行する方法がありますか?アドバンスCouch DB RDBMSのような結合操作

答えて

0

おかげで参加する方法はありませんが、しかし、あなたは、同じデータベース内、またはそれらを参照する同じ文書に添付ファイルを保存すると考えることができます。

+0

それらを参照するのと同じ文書。 – Mintu

1

私はそれを行うことが可能だということを知っているが、データベース内の加入:

ここではその上の偉大なポストだ:http://www.cmlenz.net/archives/2007/10/couchdb-joins

それの核心は、CouchDBのは、リストを含む、JSON値を注文することができるということです。

トップから取り上げましょう... CouchDBはわかっているように、JSONドキュメントを格納しています。これは、マップ関数を使用して順序付けられたキー値のペアを生成します(ここではcouchdbの確定ガイドからのページです:http://guide.couchdb.org/draft/views.html)。それでは、単純な例を取り上げて、次に「結合」に必要な複雑なものを考えてみましょう。

これは、db内の各文書を調べ、文書が著者を持っているかどうかをチェックし、作成されている場合は著者とその投稿を表示するマップ関数です。結果はキーによって順序付けられた 'キー値ペア'のリストになります。この場合は著者(アルファベット順に並べる)です。

function (doc) { 
    if (doc.author) { 
    emit(doc.author, doc.post); 
    } 
} 

ここでは複雑な例を示します。この例では、dbにはjson docsというブログ記事があり、別々のjson docsとしてコメントするものと仮定しています。コメントには、mySQLの外部IDと同様に、自分が所属するブログ投稿のIDを「投稿」と呼ぶキーがあります。

function(doc) { 
    if (doc.type == "post") { 
    emit([doc._id, 0], doc); 
    } else if (doc.type == "comment") { 
    emit([doc.post, 1], doc); 
    } 
} 

だから何が起こっているのですか?だから、気づくべき最初のことは 'else'部分です。この関数は、実際にブログの投稿とコメントを同じビュー(キー値のペアの順序付きリスト)にマップします。

'doc._id'は特定の投稿のIDで、 'doc.post'はコメントが2つの投稿のIDです。だから、リスト全体がブログ投稿のIDによって注文されている。

doc.typeが「ブログ投稿」の場合は、配列に「0」が付いているので、「コメント」であるドキュメントには「1」が付きます。今ここに魔法があります。ドキュメント(投稿とコメント)はキー値のペアの1つのリストで並べ替えられますが、CouchDBは配列を並べ替えることができるので、1つのブログ記事と次の記事の間に '1'(コメント)を付けたものをスライドします。理にかなっている?

私たちが以前使っていたものとはまったく違って、これは単なる創造的な解決策です。あなたが必要とするかもしれない結果を作成する他の多くの方法があります。これが参考になることを願っています!

関連する問題