暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

NoSQL数据库应用实践(下)

Alleria Windrunner 2020-03-04
215
我们接着上篇来说MongoDB。


MongoDB应用场景

MongoDB的应用场景有很多,例如:
  • 基于位置的移动搜索应用(基于自身的地理空间索引)

  • 日志分析平台(MongoDB本身自带的高性能聚合框架)

  • 可以存储简历、或者投递关系等相对复杂的数据结构,比如简历库

  • 可以存储用户数据,或者帖子信息,比如用户中心


MongoDB可扩展存储

MongoDB3.2引入新的可插拔存储引擎,现在支持的存储引擎包括:
  • 默认的WiredTiger存储引擎:对于许多应用而言,WiredTiger的更细粒度的并发控制和原生的压缩功能将会为最大范围的应用提供最全面的性能和存储效率

  • 新增的加密存储引擎,保护高度敏感的数据,避免了单独文件系统加密带来的性能影响或管理支出

  • 新增的内存存储引擎,为大部分实时分析要求最高的应用提供绝佳的性能和可预测的延迟


MongoDB文档设计

关于MongoDB的文档设计(文档型数据库),其实也就是对应关系型数据库的表设计。其中有亮点需要我们注意:
  • _id选择

  • _id生成


    对于_id的选择,首先其是Collection级doc的唯一标示,_id在每个集合内部唯一并且是Collection的主键,不能缺少,其类型默认是Object ID类型。长度为12个字节,由4字节时间戳+3字节机器ID+2字节进程ID+3字节计数器组成,每个字节是2位16进制数字,是一个24位字符串。但是如果我们选择默认的_id,那么其实就跟关系型数据中的自增主键类似,_id是在MongoDB服务端生成的,这样会对服务端造成一定的开销,而且对于数据库来说,不管是关系型数据库还是NoSQL还是我们后面会提到的NewSQL,其最优秀的能力是存储而不是计算,所以我们应该尽可能在客户端生成_id,那么同用的id生成器有以下:

  • Twiter Snowflake

  • 美团的Leaf


当然你可以可以自己生成,比如用timestamp + machine number + seq number。


Free Schema

很多朋友都会说MongoDB是Free Schema,其实并不是。比如在传统关系型数据库中我们表中的每一列都必须遵循Schema的设计,然而在MongoDB中Free Schema并不意味着真正的Free,而是意味着重复的Schema、ALL Schema。例如:
    {
    "id":ObjectId("4b2349854kjsdffoo2d"),
    "title":"My Blog Post",
    "content":"Here's my blog post.",
    "date":"Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
    }
    就是每一行数据你都需要声明字段名。那么这样就会带来数据存储的问题,因为字段名都是一样的,但是又必须每次都声明。怎么解决呢?我们可以尽量减少字段名本身的空间存储大小,例如:
      {name:xx,address:xx}
      可以改为:
        {n:xx,a:xx}
        但是这样又会带来新的问题,字段名的可读性问题,就是n,a代表啥意思?这个问题我们可以在应用层做字段名映射,例如:
          #define COLLECTION _USER_INFO ("user_info")
          #define USER_INFO_COLEMN_UID ("_id") //("uid")
          #define USER_INFO_COLEMN_LOGIN_NAME ("ln") //("login_name")


          Schema设计

          Schema设计我们可以分为两种场景:
          • 一对较少场景

          • 一对较多场景

          一对较少场景例如,考试成绩、个人信息等等我们直接使用内嵌式的就可以了。而对于一对较多场景我们有可以大致分为以下几种:
          • 需要单独访问对象场景

          • 不需要单独访问对象场景


          对于前者我们使用引用更为有效,而对于后者我们也可以直接使用内嵌,比如日志信息。做个总结就是:
          • 优先考虑内嵌

          • 如果我们需要单独访问一个对象那么就不适合内嵌到其他对象中

          • 数组不应该无限制增长

          • 反范式设计时需要谨慎


          MongoDB压缩算法

          最后就是MongoDB的压缩算法了,常用的分为两种:
          • Snappy

          • Zlib


          Snappy的原理是满32KB则压缩,然后满N x 4KB则落盘,N是可以配置的。而Zlib的原理则是有数据就压缩,压缩后的数据满32KB则落盘。在实际的生产环境中还是推荐Zlib的压缩算法,因为对于压缩的数据的大小可控。
          好,关于NoSQL数据库的应用实践重点就聊了下使用较多的MongoDB。
          文章转载自Alleria Windrunner,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论