NoSql参考数据

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:

Nosql并不意味着非关系型

Ian*_*cer 5

您的数据显然是相关的:文章有作者。您可以像在关系存储库BUT中一样,在像MongoDB这样的NOSQL存储库中对数据建模,因为数据库中没有联接,因此您必须对数据库进行两次调用,所以您什么也得不到。

但是...使用NOSQL存储可以做的是稍微规范化数据以提高性能(一次往返即可获得显示文章所需的一切),但要以立即保持一致为代价:始终保持准确的作者为代价最终准确的作者姓名。

例如,您可能在文章中使用以下代码:

author: {firstName: "Smarty", lastName: "Pants", _id:DE342624EF }
Run Code Online (Sandbox Code Playgroud)

现在,您可以非常快速地显示文章,并且当某人确实更改了姓名时,您可以启动后台任务来更新所有现有文章,也可以等待定期进行一致性扫描以修复它。

许多主要的网站不再为您提供即时的一致性。您所做的更改最终只会被站点上的其他用户看到。

  • 为了正确起见:他的数据不是关系数据,因为*“文章有作者” *;当他使用[关系(AKA表)](http://en.wikipedia.org/wiki/Relation_%28database%29)对其建模时,他的数据是相关的。他可以选择使用一个表,但仍然是关系表。 (5认同)

Jas*_*ith 4

我想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索引一样执行.所有查询都以短暂的,可预测的(对数)时间结束.

  • 好吧,首先请注意,您正在调用“频繁”操作,这些操作在某种程度上在数据中根深蒂固。我不确定这是否会发生在现实世界的应用程序中。(Google BigTable 和 Amazon Dynamo 共享 CouchDB 的设计,并且他们的 CMS 运行良好。)但这是一个有效的问题!重命名需要 2 个 HTTP 查询,在 2 秒内完成。即使每天有 1,000 个用户更改名称,也相当于每 1.4 分钟更改一次 2 秒的名称。看起来足够了!但更重要的一点是:CouchDB 有弱点和不足。它们可能很严重!但有时它们值得权衡。 (2认同)