免责声明:对于引用数据,我不是指引用完整性
我正在学习nosql,并想了解数据应该如何建模。例如,在CMS应用程序的典型关系数据库中,您可能有两个表:文章和作者,其中文章引用了作者。
在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"
}等等..。
比如说,有一天,Smarty先生决定把他的名字改成普通的Joe,因为nosql已经变得无处不在了。在这种情况下,需要扫描每一篇文章,并更新作者的姓名。
因此,我的问题是,如何在nosql中建模数据以适应CMS的基本用例,从而使的性能达到或超过RDBMS?mongodb,例如,声称CMS是一个用例.
编辑
很少有人建议对数据进行规范化,例如:
article
{
title: "Death to RDBMS",
slug: "rdbms_sucks",
author: {id: "10000001"}
}
author
{
name: "Big Brother",
id: "10000001"
}但是,由于nosql在设计上缺少联接,所以您必须使用类似mapreduce的函数将数据组合在一起。如果这是你的建议,请评论这种操作的表现。
编辑2:
如果您认为nosql不适合于需要引用数据的任何类型的数据,请解释原因。这似乎使nosql的用例相当有限,因为任何合理的应用程序都将包含关系数据。
编辑3:
Nosql并不意味着非关系
发布于 2011-09-29 04:06:52
如果您这么说的话,我认为CouchDB是一个NoSQL数据库。
但实际上,我们有通用的编程语言和特定于领域的语言。类似地,CouchDB是一个特定于域的数据库.
我经常使用CouchDB,但我真的不在乎它是使用SQL还是使用NoSQL。CouchDB (对我来说)很有价值,因为API是100%的HTTP和Javascript。您可以使用浏览器构建web应用程序,从CouchDB获取HTML,然后通过AJAX查询数据。说这是“不是SQL”是轻描淡写的!
不管怎样,回到Smarty Pants和普通的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!");
})
}
})是的,这种技术可以让你在计算机科学课上获得F。不过,我喜欢。我会用Firebug编写这段代码。在我的浏览器里。重命名不是原子的,也没有引用完整性。另一方面,它可能会在几秒钟内完成,没有人会在意。
你可能会说,CouchDB在时髦的词汇和基准上失败了,但却是最难的一群。
P.S. by_user视图是从map-还原生成的。在CouchDB中,map- most是增量式的,这意味着它的性能与大多数SQL索引一样。所有查询都在短时间内完成,可以预测(对数)。
发布于 2011-09-29 04:37:14
您的数据显然是相关的:一篇文章有一个作者。您可以像在关系存储中一样在NOSQL存储中对数据建模,就像在关系存储中一样,但是由于数据库中没有连接,所以您必须对数据库进行两次调用,因此没有获得任何信息。
但是..。对于NOSQL存储,您可以做的是对数据进行某种程度的去of,以获得更好的性能(只需一次往返,就可以获得显示文章所需的一切),但代价是立即保持一致性:将始终准确的作者名称交换为最终准确的作者名称。
例如,您可以在文章中使用以下内容:
author: {firstName: "Smarty", lastName: "Pants", _id:DE342624EF }现在,您可以非常快地显示文章,当有人更改名称时,您可以启动一个后台任务来更新所有现有的文章,或者等待定期的一致性扫描来修复它。
许多主要的网站不再给你即时的一致性。您所做的一些更改最终只会被站点上的其他用户看到。
发布于 2011-09-29 03:42:35
对于您的具体情况,使用飞重模式,存储对象id而不是对象实体。
article
{
title: "Death to RDBMS",
slug: "rdbms_sucks",
author: {id: "10000001"}
}
author
{
name: "Big Brother",
id: "10000001"
}有关通用mongodb设计建议,请阅读官方文件
https://stackoverflow.com/questions/7591943
复制相似问题