2 つのドキュメント「タイプ」があります:Post
とUser
:
典型的な投稿:
{
"_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
代わりに、ドキュメントとPost
aPost
のドキュメントの両方にインデックスを付けるビューを作成できます_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でこの種のインデックス作成は可能ですか?