NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚。但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题?

这个疑惑非常大,为此我看了很多分析文章,但却总感觉是隔靴搔痒。为了一探究竟,半年前我决定用Mongodb这个著名的NoSql数据库做个产品试试。只有在真实的使用环境中才能得到最贴切的感受。

一晃眼,半年过去了,现在我能用亲身的体会来谈谈NoSql数据库存在的理由和试图解决的问题了。就像所有的哲学思考都来源于对日常活动的观察一样,我们也从最基本的东西说起吧。

来看这样一个业务要求,用户可以为一本书打分,并且写评论。熟悉数据库结构设计的人看到这一句话脑子里应该瞬间就会出现下面这样的表结构(我这里就不太讲究了,大家意会即可):

用户信息表,书籍信息表,用户为书籍打分信息表,评论表。

现在假想要做一个显示评论内容的页面,上面会有用户信息和相关书籍的信息,想必大家脑子里已经出现各种select和join了吧。

如果用NoSql还是同样的设计的话,那你会惊喜的发现NoSql数据库的性能简直差到爆。性子火爆的估计当场就要掀桌。

什么破烂数据库,不是号称性能一流的吗!

好吧,性能问题也就不说了,竟然连事务都不支持!?那我同时插入四张表的数据该怎么保持一致?开玩笑的吧!

NoSql数据库此时默默的泪流满面,冤枉啊……你别说,还真是冤枉它了。

先从最基本的设计元素说起,几乎所有的NoSql数据库都没有表(table)的概念,取而代之的是文档(document)。文档是个什么东西?Mongodb的解释,文档是一个使用JSON格式以key-value方式存储数据的结构,比如:

{ "item": "pencil", "qty": 500, "type": "no.2" }
看起来和表没什么不同嘛?咳咳,JSON是支持嵌套结构的,比如可以把书籍信息和用户打分的信息存到一起:

{
  "id": "123zxcrweq2",
  "title": "雪中悍刀行",
  "author": "烽火戏诸侯",
  "scores": [
    {
      "userid": "454zxcfwer1",
      "nickname": "Allen",
      "score": 3,
    },
    {
      "userid": "678zxkiou1",
      "nickname": "Judy",
      "score": 4,
    }
  ],
}

一堆document存储到一起就叫做collection,而同一个collection里面的document可以不一样。注意,这里也是重点概念。如果切换到关系型数据库的话,相当于一张表里每一行数据的列都可以不一样。这不是乱套了吗?用不好确实会乱套的。

概念说完了,来看看面对下面这种产品要求的时候应该怎么办。产品经理说了,要在书籍信息页面看到所有评论,评论人的信息和打的分也要出现。

如果是关系数据库,获取数据的思路是这样的:

1. 根据书籍Id取到书籍信息。

2. 根据书籍Id取到所有评论信息。

3. 根据评论信息中的用户Id取到相关用户的信息。

4. 根据书籍Id和用户Id取到打分信息。

那在NoSql数据库中如果我们用如下结构存储数据的话……

{
  "id": "123zxcrweq2",
  "title": "雪中悍刀行",
  "author": "烽火戏诸侯",
  "comments": [
    {
      "author": {
        "id": "454zxcfwer1",
        "nickname": "Allen",
        "avatarurl": "头像1.png",
      },
      "score": 3,
      "title": "书评1",
      "content": "书评内容1",
    },
    {
      "author": {
        "id": "454zxcfwer1",
        "nickname": "Judy",
        "avatarurl": "头像2.png",
      },
      "score": 4,
      "title": "书评2",
      "content": "书评内容2"
    }
  ],
}

似乎只要根据书籍Id查询一次就能得到结果了吧……明白为什么说NoSql数据库效率高了吗?一边是从四个集合中查找数据,一边是从一个集合中查找数据,这运行效率肉眼就能看出来差别了吧。

所以到这里我得到了一条设计心得,尽可能把一次展示所需的必要数据都存储到一起。这是典型的空间换时间。所幸现在的科技条件下空间的价格非常低廉,所以很划算。

根据这个设计结构,似乎也不需要事务的支持了,用户为一本书籍打分只需要在一个document里面添加数据就够了。

好,document特性的用处明白了,现在就来研究下NoSql数据库另外一条原则的用途了,还记得是什么吗?同一个collection里面的document可以不一样

还是从实际应用中来看,某日,产品经理说,书籍详细信息页面上还要显示书评的创建时间。

如果使用关系数据库该怎么办?

1. 创建一个为Review表增加”creationtime“列的sql脚本。

2. 到数据库中运行。

3. 修改相关代码和存储过程。

NoSql呢?

1. 在Comment结构实体中增加CreationTime,增加赋值代码。

没了,不需要去修改历史数据,因为?同一个collection里面的document可以不一样。那如果取到历史数据怎么办?Comment的CreationTime会被置为空。挺合理的,也不会产生什么危害。

大家都知道,互联网产品的更新速度是非常快的,经常根据用户反馈和市场情况调整产品形态,而数据结构也会经常发生变化。为了适应这种环境,如何处理 历史数据就成了老大难。还记得当年看到一个DBA在设计表的时候会留出几个字段叫做”Reserved1,Reserved2……“,感觉好无厘头,浪费 空间,后来随着产品功能的增加才明白这其实是经验丰富的表现。如果用NoSql就不用这么纠结了。

总结一下,就我浅薄的使用经验来看,NoSql的优点是:1. 在精心的设计下查询性能巨好。2. 数据结构弹性十足,特别适合快速发展中的产品。

另外需要提醒一下,Mongodb不支持事务,所以务必在设计的时候考虑到这一点。核心业务数据尽可能通过结构设计做到数据插入的一致性。如果实在无法达成,请立即转回去用关系数据库,否则或早或晚你一定会后悔的。

转于:http://www.cnblogs.com/AllenDang/p/3507821.html

转载于:https://www.cnblogs.com/Alight/p/3511694.html

NoSql数据库使用半年后在设计上面的一些心得相关推荐

  1. 先睹为快:甲骨文NoSQL数据库

    在过去的几年里,NoSQL数据库的世界里充满了各种有趣的新项目,雄心勃勃的声明和大量信誓旦旦的承诺.有传闻称最新的NoSQL数据库软件套装通过调整所有的结构和数据库创建者多年来一直希望增加的三倍校验来 ...

  2. 大数据技术原理与应用——NoSQL数据库

    大数据技术原理与应用--NoSQL数据库 5.1 NoSQL 简介 特点 1.灵活的可扩展性 传统的关系型数据库由于自身设计机理的原因,通常很难实现"横向扩展",在面对数据库负载大 ...

  3. 云计算背后的秘密(6)-NoSQL数据库的综述

    我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoSQL有了非常深入的研究,但是在最近准备YunTable的Chart的时候,发现NoSQL不仅非常博大精深,而且我个人对NoSQL的理解也只 ...

  4. mysql数据库需求分析工具_一份全面的“数据库设计需求分析”是怎样的?

    原标题:一份全面的"数据库设计需求分析"是怎样的? 本文笔者将与大家分析数据库外部设计需求.结构设计需求.运用设计需求以及安全保密设计需求. 数据库设计需求 1. 需求概述 建立完 ...

  5. 细数 Windows 平台上的 NoSQL 数据库

    从可查询的分布式解决方案,如MongoDB,到简单的分布式Key/Value存储解决方案,如Cassandra.此外,还有Riak,Tokyo Cabinet,Voldemort,CouchDB和Re ...

  6. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶

    一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...

  7. mysql事务在提交后才发送给数据库执行_从一个线上问题分析binlog与内部XA事务提交过程...

    1. 问题 业务上新增一条订单记录,用户接收到BinLake拉取的MySQL从库数据消息后,马上根据消息内的订单号去查询同一个MySQL从库,发现有些时候无法查到该条数据,等待大约500ms-1000 ...

  8. 在centos上,oracle数据库更改IP后无法启动监听,解决方法

    在centos上,oracle数据库更改IP后无法启动监听,解决方法 参考文章: (1)在centos上,oracle数据库更改IP后无法启动监听,解决方法 (2)https://www.cnblog ...

  9. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶 1

    一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...

最新文章

  1. Android Dialog 弹框之外的区域 默认透明背景色修改
  2. 附录:PyTorch记事本
  3. python乘法口诀代码-浅析一句python代码成生九九乘法表
  4. 设计模式 之 适配器模式
  5. oracle的sqlload遇到超长,oracle sqlload
  6. 计算机系统-函数调用约定/调用规范/传参方式
  7. k8s prometheus/grafana 监控系统建设
  8. 对存在过期 binlog 的 MySQL5.7 添加从服务器
  9. Java练习题(String)
  10. Tsinsen-A1103 ====单循环赛制====固定轮转法。。
  11. 用Scratch制作手游的角色方向虚拟控制器/虚拟摇杆的方法+源码
  12. 行业观察(一)| 从渠道为王到数据为王——浅谈服装零售企业的数字化转型
  13. python画聚类树状图_如何在scipy/matplotlib中绘制和标注层次聚类树状图
  14. 服务器安装系统提示加载驱动程序,解决安装win7的提示“加载驱动程序”的问题...
  15. MySQL入门系列:查询简介(一)
  16. android 英语词库
  17. 计算机组成原理<五>——存储系统
  18. java 1603,win10系统安装软件提示功能传送错误1603的处理方法
  19. “江湖笑”-献给怀有梦想的北漂一族
  20. python分苹果问题_分苹果问题的C++和Python实现

热门文章

  1. 什么样的网站结构备受搜索引擎喜爱?
  2. 如何提升网站在搜索引擎中的排名?
  3. 影响网站快照异常的因素有哪些?
  4. java 多线程 原子操作_线程安全之原子操作
  5. mysql 网络io_MySQL的各种网络IO超时的用法和实现
  6. mysql多列索引用处_MySQL索引使用说明(单列索引和多列索引)
  7. python提供的默认的构造方法是什么_Python面试常见问题,__init__是构造函数吗?...
  8. android从放弃到精通第10天 勿忘初心
  9. 积神经网络的参数优化方法——调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少....
  10. 机器学习中的数据不平衡问题----通过随机采样比例大的类别使得训练集中大类的个数与小类相当,或者模型中加入惩罚项...