【发布时间】:2012-01-29 21:05:50
【问题描述】:
我最近在业余时间一直在使用 Couch DB 进行大量工作,并且非常喜欢使用它。我发现它比使用关系数据库灵活得多,但也不是没有缺点。
一个很大的缺点是缺少动态查询/视图生成...因此,您必须做大量工作来规划和证明您的视图,因为您不能像您可能的那样将该逻辑放入您的应用程序代码中使用 SQL。
例如,我基于一个 JSON 文档模板编写了一个登录方案,看起来有点像这样:
{
"_id": "blah",
"type": "user",
"name": "Bob",
"email": "bob@theaquarium.com",
"password": "blah",
}
为了防止创建重复帐户,我编写了一个非常基本的视图来生成用户名列表以作为键查找:
emit(doc.name, null)
这对我来说似乎相当有效。我认为这比拖出整个文档列表(甚至只是减少每个文档的字段数量)要好得多。所以我做了完全相同的事情来生成一个电子邮件地址列表:
emit(doc.email, null)
你知道我要回答这个问题吗?
在关系数据库(使用 SQL)中,只需对同一张表进行两次查询。这种技术(将视图等同于 SQL 查询的结果)在某种程度上是否类似?
然后是性能/效率问题......这两个视图真的应该只是一个吗?还是使用带有键且没有关联值的 Couch DB 视图是一种有效的做法?考虑到上面的例子,这两个视图都会在登录方案之外使用......如果我需要生成用户名列表,我可以在没有额外开销的情况下检索它们。
你怎么看?
【问题讨论】:
-
使用
emit(doc.name, null)构建视图类似于在SQL 表的name列上构建索引。所以这与您在关系数据库中所做的没有什么不同。
标签: views nosql couchdb mapreduce document-oriented-db