Disclaimer: by referential Data, i do not mean referential integrity

我正在学习nosql,希望了解数据应该如何建模.例如,在CMS应用程序的典型关系数据库中,可能有两个表:article和author,其中article引用了author.

在nosql系统中,您可以这样创建一个文章文档,因为它们只有disguised object graph

{
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 Pants先生决定将自己的名字改为普通的Joe,因为nosql已经无处不在.在这种情况下,每一篇文章都需要扫描并更新作者姓名.

所以我的问题是,数据应该如何在nosql中建模,以适合CMS的基本用例,从而实现the performance is on par or faster than RDBMS?例如,mongodb声称CMS是一个用例...

Edit:

很少有人建议对数据进行标准化,比如:

article 
{
title: "Death to RDBMS",
slug: "rdbms_sucks", 
author: {id: "10000001"}
}

author
{
name: "Big Brother",
id: "10000001"
}

然而,由于nosql在设计上缺乏连接,因此必须使用类似mapreduce的函数来将数据汇集在一起.如果这是你的建议,请对此类行动的表现发表 comments .

Edit 2:

如果您认为nosql不适合任何需要参考数据的数据,请解释原因.这似乎使nosql的使用情况变得相当有限,因为任何合理的应用程序都会包含关系数据.

Edit 3:

Nosql doesn't mean non-relational

推荐答案

我想CouchDB是一个NoSQL数据库,如果你这么说的话.

但实际上,我们有general-purpose种编程语言和domain-specific种语言.类似地,CouchDB是domain-specific database.

我经常使用CouchDB,但我真的不在乎它是使用SQL还是NoSQL.CouchDB(对我来说)很有价值,因为API是100%的HTTP、JSON和Javascript.您可以使用浏览器从CouchDB获取HTML,然后通过AJAX查询数据来构建web应用程序.说这是"不是SQL"是轻描淡写!

不管怎样,回到Smarty裤子和普通乔身上.也许他有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.然而,我喜欢它.我会写in Firebug. In my browser码.重命名不是原子的,它没有引用完整性.另一方面,它可能会在几秒钟内完成,没有人会在意.

你可能会说CouchDB在流行语和基准测试中失败了,但在困难的学校中却取得了成功.

另外,by_user视图是根据map reduce构建的.在CouchDB中,map reduce是incremental,这意味着它的性能与大多数SQL索引类似.所有查询都会在一个短的、可预测的(对数)时间内完成.

Mongodb相关问答推荐

如何根据两个 struct 创建一个Mongo文档?

如何用Python和MongoDB找到单据字段的最大值?

MongoDB - 将数组元素转换为新字段

Kotlin 使用初级构造实例化公开类

如何获取mongodb ObjectId的值?

有谁知道这个错误的修复方法(TypeError: Cannot assign to read only property ‘map’ of object '#')

如何使用 mongoose 从 MongoDb 获取数据?

mongodb上不区分大小写的查询

如何使用 -number 后缀对字符串进行 MongoDB 查询排序?

Node + Mongoose:获取最后插入的 ID?

如何使用 mgo 和 Go 查询 MongoDB 的日期范围?

在 mongodb 中的索引列上查找重复项的快速方法

如何使用服务器实例指定 mongodb 用户名和密码?

Mongoose - 获取 _id 列表而不是具有 _id 的对象数组

无法将 Mongoose 连接到 Atlas

在 mongoose 中使用 UUID 进行 ObjectID 引用

如何通过键名从 mongoDB 中检索值?

无法在 mac os 10.9 上安装 mongodb php 驱动程序

是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?

将日期从毫秒转换为 ISODate 对象