1.NoSQL和SQL

🌙 1.NoSQL和SQL

  • 关系型数据库,是指采用了关系模型来组织的数据库
  • 非关系型数据库是对不同于传统的关系型数据库的数据管理系统的统称

🌙 2.NoSQL意义

  • 易扩展,高性能,高可用
  • 较容易映射复杂数据(key-value)
  • 无事务特殊要求(ACID)

🌙 3.NoSQL设计

🌙 3.1常见场景及设计方法:

🌙 3.1.1内嵌

指存在关联关系的文档,放在同一文档中,以数组的形式存放

  • 减少了关联查询
  • 适合于单类需要描述的属性
  • 不经常变化的属性(扩展、嵌套关联)
{
  "username": "zkk",
  "gender": 0,
  "roles": ["admin", "user"],
  "address": [
    "address1",
    "address2"  
  ]
}
1
2
3
4
5
6
7
8
9

🌙 3.1.2 父/子引用

  • 父引用:指存在一对多的情况中,放在同一文档以数组的形式存放:
{
 "tid": "postID",
 "title": "post title",
 "catalog": "index",
 "created": "13123141",
 "comments": [
   "commentID1",
   "commentID2"
 ]
}
1
2
3
4
5
6
7
8
9
10
  • 子引用:指存在一对非常多的情况中,由于数据库文档存放限制,这时候进行反向引用
{
  "cid": "commentID",
  "tid": "postID",
  "content": "answer content",
  "isRead": 0,
  "isBest": 0,
  "status": 1
}
1
2
3
4
5
6
7
8

父/子引用注意事项:

  • 引用数据内容是否非常多
  • 引用数据量是否非常庞大,而且在增加
  • 数据是否需要单独访问

🌙 3.2 反范式

范式是指按既定的用法,范式就是一种公认的模型或模式。(如:右手用筷子) 反范式 -> 不走寻常路(如:左手用筷子)

之前的父/子引用就是范式。反范式示例:

{
  "tid": "postID",
  "title": "post title",
  "created": "12313123",
  "users": [{
    "uid": "user id",
    "name": "user name",
    "isVip": 1  
  }]
}
1
2
3
4
5
6
7
8
9
10

反范式设计注意:

  • 是否有提升性能的区间
  • 数据量的变化是否非常庞大,庞大到更新会异常低效
  • 先考虑读写比,才考虑反范式

🌙 设计原则小结

  • 优先考虑内嵌,如果单独访问,则不合适
  • 数组不应该无限制增长
  • 考虑读写比,考虑反范式,考虑应用场景

🌙 3.3 双向关联的场景及设计原则

从 SQL 到 MongoDB,这一篇就够了 (opens new window) MongoDB快速入门,掌握这些刚刚好! (opens new window) 前后端分离 Vue + NodeJS(Koa) + MongoDB,从产品到开发,全栈实践 (opens new window)