ltf*_*hie 15 couchdb mongodb cassandra nosql
免责声明:通过参考数据,我不是指参照完整性
我正在学习nosql,并想了解数据应该如何建模.例如,在CMS应用程序的典型关系数据库中,您可能有两个表:article和author,其中article引用了作者.
在nosql系统中,您可以通过这种方式创建文章文档,因为它们只是伪装的对象图
{
title: "Learn nosql in 5 minutes",
slug: "nosql_is_easy",
author: {firstName: "Smarty"
lastName: "Pants"
}
{
title: "Death to RDBMS",
slug: "rdbms_sucks",
author: {firstName: "Smarty"
lastName: "Pants"
}
Run Code Online (Sandbox Code Playgroud)
等等...
有一天,Smarty Pants先生决定将他的名字改为Regular Joe,因为nosql已经无处不在.在这种用例中,需要扫描每篇文章并更新作者姓名.
所以我的问题是,如何在nosql中建模数据以适应CMS的基本用例,以便性能与RDBMS相当或更快?例如,mongodb声称CMS是一个用例......
编辑:
很少有人建议将数据标准化,例如:
article
{
title: "Death to RDBMS",
slug: "rdbms_sucks",
author: {id: "10000001"}
}
author
{
name: "Big Brother",
id: "10000001"
}
Run Code Online (Sandbox Code Playgroud)
但是,由于nosql在设计上缺少连接,因此必须使用类似mapreduce的函数将数据组合在一起.如果这是您的建议,请评论此类操作的执行情况.
编辑2:
如果您认为nosql不适合需要参考数据的任何类型的数据,请解释原因.这似乎使得nosql的用例相当有限,因为任何合理的应用程序都将包含关系数据.
编辑3:
您的数据显然是相关的:文章有作者。您可以像在关系存储库BUT中一样,在像MongoDB这样的NOSQL存储库中对数据建模,因为数据库中没有联接,因此您必须对数据库进行两次调用,所以您什么也得不到。
但是...使用NOSQL存储可以做的是稍微规范化数据以提高性能(一次往返即可获得显示文章所需的一切),但要以立即保持一致为代价:始终保持准确的作者为代价最终准确的作者姓名。
例如,您可能在文章中使用以下代码:
author: {firstName: "Smarty", lastName: "Pants", _id:DE342624EF }
Run Code Online (Sandbox Code Playgroud)
现在,您可以非常快速地显示文章,并且当某人确实更改了姓名时,您可以启动后台任务来更新所有现有文章,也可以等待定期进行一致性扫描以修复它。
许多主要的网站不再为您提供即时的一致性。您所做的更改最终只会被站点上的其他用户看到。
我想CouchDB是一个NoSQL数据库,如果你这么说的话.
但实际上,我们拥有通用编程语言和特定领域语言.同样,CouchDB是一个特定于域的数据库.
我经常使用CouchDB,但我真的不在乎它是使用SQL还是NoSQL.CouchDB对我来说很有价值,因为API是100%HTTP,JSON和Javascript.您可以使用浏览器从CouchDB获取HTML,然后通过AJAX查询数据来构建Web应用程序.说这不是"SQL"是轻描淡写!
无论如何,回到Smarty Pants和Regular Joe.也许他有10万份文件.如果我们刚刚更新了所有内容,那会怎么样?嗯,这是一个相当少量的Javascript.
$.getJSON('/db/_design/cms/_view/by_user?key=Smarty+Pants', {
success: function(result) {
// Change the name right here, in the result objects.
var docs = result.rows.map(function(row) {
row.value.firstName = "Regular";
row.value.lastName = "Joe";
return row.value;
})
// Store it!
$.post('/db/_bulk_docs', {"docs":docs}, function() {
console.log("Done! Renamed Smarty Pants in " + docs.length + " documents!");
})
}
})
Run Code Online (Sandbox Code Playgroud)
是的,这种技术可以让你获得计算机科学课程.但是,我喜欢它.我会在Firebug中编写这段代码.在我的浏览器中.重命名不是原子的,它没有参照完整性.另一方面,它可能会在几秒钟内完成,没人会关心.
你可能会说CouchDB在流行语和基准测试中失败,但却让学校陷入困境.
PS by_user
视图由map-reduce构建.在CouchDB中,map-reduce是增量的,这意味着它像大多数SQL索引一样执行.所有查询都以短暂的,可预测的(对数)时间结束.
归档时间: |
|
查看次数: |
4737 次 |
最近记录: |