2

2 つのドキュメント「タイプ」があります:PostUser:

典型的な投稿:

{
   "_id": "3847345345",
   "Schema": "Post",
   "Text": "Hello World! This is a post!",
   "IsFeatured": true,
   "UserID": "12345345345234234"
}

一般的なユーザー:

{
   "_id": "12345345345234234",
   "Schema": "User",
   "Username": "georgepowell"
   "PostIds": ["3847345345","5135345345","9987453236", ... ]
}

を表示する Web ページでは、PostそのUsername投稿 (およびそのユーザーに関するその他の変更可能な情報) の が投稿の横に表示されます。SOに似ています: ユーザー情報

これは、SQL JOIN が最適な状況の典型的な例ですが、もちろん CouchDB はそのようなものをサポートしていません。User代わりに、ドキュメントとPostaPostのドキュメントの両方にインデックスを付けるビューを作成できます_id。このような:

function(doc) {
    if (doc.Schema = 'Post') {
        emit([doc._id, 0], null);
    } else if (doc.Schema = 'User') {
        foreach (string id in doc.PostIds) // not javascript I know. shhh
            emit([id, 1], null);
    }
}

Post単一のが与えられた場合、必要なすべての情報を効率的に取得できるため、これはうまく機能します_id

ただし、すべての投稿とすべてのユーザー データを一覧表示するビューを作成したい場合は、IsFeatured == true行き詰まります。

function(doc) {
    if (doc.Schema = 'Post' && doc.IsFeatured) {
        emit([doc._id, 0], null);
    } else if (doc.Schema = 'User') {
        foreach (string id in doc.PostIds)
            emit([id, 1], null); // I can't check if the post is featured!
    }
}

リレーショナル データの CouchDB の制限に達しましたか? または、CouchDBでこの種のインデックス作成は可能ですか?

4

1 に答える 1