我在Apache CouchDB上构建了一个非常简单的用户系统。我建立一个简单的视图通过电子邮件进行搜索的用户:CouchDB简单选择正确的方式?
by_email
map
function(doc) {
if (doc.kind == "user" && doc.email) emit(doc.email, doc.name);
}
这将返回
{"id"=>"00006a80-723b-012f-6b38-1040f398478e", "key"=>"[email protected]", "value"=>"Spiderman"}
现在我可能会丢失一些非常愚蠢的(如果这是我做的情况下,我道歉),但你为什么只能从这个视图中检索2个字段(如果我们计算ID,则为3个)?
就像你可能希望搜索您的用户从电子邮件或用户ID启动数据库和检索完整的文档属于正常情况。
现在我读过的例子在http://guide.couchdb.org/draft/cookbook.html(查找由键) ,除非我失去了一些东西很琐碎,结果是不完整的有太多,因为它会具有一定的年龄并没有什么回报广大用户的唯一名称更多。
我不明白这是如何作出正确的使用:如果您查询您的客户,供应商,无论你将要完整的文档回来,不只是价值的1或2
所以分贝我的解决方案是另一种观点:
mailplus
map
function(doc) { if (doc.kind == "user" && doc.email) emit(doc.email,doc) }
所以要返回我的电子邮件,但也作为价值的完整文件。这可以工作,但你可以想象它在一个更大的数据库中相当慢。
所以,问题是:有没有更好的方法做一个简单的查询,检索有关用户通过电子邮件,例如使用CouchDB的搜索全部细节 - NoSQL的?
我知道,回答“这是错误的,因为你不能在NoSQL中思考SQL”,而是等待:在真实世界的应用程序中,按照Documents和No/Table /希望为用户提供完整的文档。想象一下,你有一个简单的系统来检索客户端的细节。你需要完整的文档。只有当你提供密钥,电子邮件时,你才需要知道ID和密钥。
所以一个可能的解决方案是使用例如电子邮件作为id(或用户名)?这将强制唯一用户(尽管复制有限),这是另一个问题。老实说,我想我错过了一些东西:没有验证一个记录(validates_uniqueness_of:email,:用户名),这是一个相当基本的东西,并且在Web开发中有所期待?因为它为用户提供完整的配置文件。G。当用户想要修改他的详细信息等。 – devnull
对于这种唯一性验证,您可以为每个文档发送两次,首先以电子邮件为关键字,然后以名称命名,之后检查两个键的出现结果视图(请参阅couchdb维基) 。但它不能解决问题,因为有人可以在检查后插入记录,而且在复制的情况下可以在不同的服务器上插入冲突的密钥,如何解决冲突?正确的解决方案应该使用像mysql这样的数据库约束,afair rails不会在他们的activerecord中使用它们。 couchdb具有服务器端验证器,但不能进行子查询 – avsej