NoSql数据库使用半年后在设计上面的一些心得 (转)
http://www.cnblogs.com/AllenDang/p/3507821.html
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不支持事务,所以务必在设计的时候考虑到这一点。核心业务数据尽可能通过结构设计做到数据插入的一致性。如果实在无法达成,请立即转回去用关系数据库,否则或早或晚你一定会后悔的。
NoSql数据库使用半年后在设计上面的一些心得 (转)的更多相关文章
- NoSql数据库使用半年后在设计上面的一些心得
NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...
- NoSql数据库使用半年后在设计上面的一些心得 (转载)
NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...
- NoSql数据库 设计上面的一些心得
NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 用户信息表,书籍信息表,用户为书籍打分信 ...
- NoSql数据库使用
NoSql数据库使用半年后在设计上面的一些心得 NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么 ...
- SnappyDB—Android上的NoSQL数据库简介
参考:http://www.open-open.com/lib/view/open1420816891937.html 参考:http://android-arsenal.com/details/1/ ...
- 【一个idea】YesSql,一种在经典nosql数据库redis上实现SQL引擎的方案(我就要开历史的倒车)
公众号链接 最高级的红酒,一定要掺上雪碧才好喝. 基于这样的品味,我设计出了一套在经典nosql数据库redis上实现SQL引擎的方法.既然redis号称nosql,而我偏要把SQL加到redis上, ...
- 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶
一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...
- 园子的品牌专区上新:NoSQL 数据库佼佼者 Aerospike
品牌专区是园子去年推出的新楼盘,为优秀的科技企业在园子里提供一个地方,展示自己的品牌,分享自己的技术内容. 最近我们和国外领先的 NoSQL 数据库厂商 Aerospike 达成了合作,入驻了园子的品 ...
- 几款主流 NoSql 数据库的对比
最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...
随机推荐
- Failed to execute command: ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ResGen.exe" 的一个解决办法
最近在做wpf项目,期间下了一些源码参考,但是在build时经常遇到下面这种bug: Error 2 Failed to execute command: ""C:\Program ...
- 给UITextField左侧加一个小图标
xcode 6.1 File-New-Project.. iOs-Application-Simple View Application 1.写一个自定义JSTextField类,继承UITextFi ...
- lua5.3调用C/C++
马上面临毕业设计,打算做点跟网游有关的,先从做周边工具开始,目前正在做一个协议序列化和反序列化的东西,广告一波先: https://github.com/Anti-Magic/rproto 目前非常简 ...
- 域名的a记录转过来他的公网ip
首先 客户要我把域名 和项目进行绑定客户需要提供万网或者新网的账户,登进去域名管理 选项域名管理的A记录定向到那个公网ip上 与服务器做绑定然后 在服务器的iis 上 加个主机头 输入主机头名称 也 ...
- bnuoj 4225 杨辉三角形(规律)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4225 [题意]: 给定任意杨辉三角的行数n,请输出杨辉三角中前n行中总共有多少偶数. [题解]: 找 ...
- 深入浅出百度地图API开发系列(2):创建地图
上一篇文章里,先介绍了一下百度地图API开发所涉及到的一些基础概念,包括投影,坐标系等基础概念,再有了这些基础后,我们可以开始开发自己的web地图了.先来个代码示例(建议大家都是用百度地图API大众版 ...
- HTML5 中的块级链接
英文叫做 “Block-level” links,我以为只有我厂那些鸟毛不知道,没想到不知道的还挺多, 需要普及一下. 最近看了 kejun 的 PPT 前端开发理论热点面对面:从怎么看,到怎么做?, ...
- LNMP笔记:更改网站文件和MySQL数据库的存放目录
配置好LNMP环境以后,默认的网站目录和数据库存放目录都在系统盘,所以我们需要将它们转移到数据盘. 更改网站文件目录 如果你使用的是军哥的lnmp一键安装包,那默认的虚拟主机配置环境在 /usr/lo ...
- uva 10827
与108类似 多加了两层循环 水过 #include <iostream> #include <cstring> #include <cstdio> #includ ...
- [js综合问题汇总]js窗口关闭事件,表单名称,父窗口子窗口,var变量名
<script type="text/javascript"> window.onbeforeunload = onbeforeunload_handler; //wi ...