在日常开发中,我一般用mysql数据储存数据,memcache储存缓存,但是我不知道如mongodb这一类的nosql数据库到底相比mysql这种数据库有什么优势,在什么场景下我改选择mongodb这种数据库?希望各位能用浅显的语言帮忙解释下。
认证0级讲师
举一个例子:
mysql:一个表中有5个字段,你程序已经写好了,然后这边要加两个字段,于是你先去数据库修改表结构,增加字段,然后回到程序,修改sql代码。
mongodb : 一个对象有5个属性,你程序已经写好了,然后这边要加两个属性(字段),你直接在程序里加上,就OK了。
关系型数据库,一条记录是一行,一个字段是一列,数据处在行与列的交叉处。多行多列必须遵循相同的二维结构。
非关系数据库,属性只属于对象。对象之间是独立的。
长线业务用mysql+memcache组合,统计日志类业务或者PM拍脑门硬上的临时事务用mongodb+redis的组合。mongodb的优势是灵活,劣势也是灵活,稳定性不如mysql
相对于传统的关系型数据库,MongoDB是非关系型数据库的代表之一。要知道什么时候应该使用MongoDB,首先应该知道它具有一些什么特性,能做什么和不能做什么,然后根据具体情况决定是否使用。建议先阅读一下官方文档中的介绍部分,其中列举的是MongoDB最关键的特性,其他所有功能几乎都是围绕这些特性展开。这些特性大部分时候也是决定是否采用MongoDB的关键因素。这里有一篇文章也简单粗暴地介绍了如何选择的问题。然而,随着技术发展,所谓“关系型”和“非关系型”的界线已经越来越模糊,一方面Postgre、MySQL这些传统RDBMS开始支持JSON这样的非关系模型,另一方面MongoDB也开始支持JOIN,甚至将来会支持事务。既然界限变得模糊,那么什么时候应该使用哪种技术也就不能一概而论了,比较结果往往是既能用这个,又能用那个。但是你确实可以比较如果在项目中使用了某种技术,会得到什么,失去什么,然后权衡得到的部分是否能弥补损失的部分,最终决定是否采用这种技术。
数据的结构不一定的时候用mongodb最好,比如你sql数据库中要先定义所有字段的类型,名字,长度什么的,这就缺少了弹性,mongodb在某个字段数据不存在的时候就当他没有。
举个例子,假设我们的服务器要在数据库里保存系统发生的事件event。某某用户做了某某事,有时候你要纪录他发送的post的原始的body内容以备查询,有的时候又不要,那么在不需要纪录post内容的时候,假如你在sql中定义string长度为1000,就浪费了这段空间,mongodb就不会。并且在取出这条记录的时候,sql数据库会返回你定义的那个结构,即使其中的一个字段为空,而mongodb由于保存的时候就没有包含那个为空的字段,取出来的时候也同样不会有。
还有就是mongodb对于json的各种结构支持的很不错,当然这应该不是你采用mongodb的主要目的。
举一个例子:
mysql:一个表中有5个字段,你程序已经写好了,然后这边要加两个字段,于是你先去数据库修改表结构,增加字段,然后回到程序,修改sql代码。
mongodb : 一个对象有5个属性,你程序已经写好了,然后这边要加两个属性(字段),你直接在程序里加上,就OK了。
关系型数据库,一条记录是一行,一个字段是一列,数据处在行与列的交叉处。多行多列必须遵循相同的二维结构。
非关系数据库,属性只属于对象。对象之间是独立的。
长线业务用mysql+memcache组合,统计日志类业务或者PM拍脑门硬上的临时事务用mongodb+redis的组合。
mongodb的优势是灵活,劣势也是灵活,稳定性不如mysql
相对于传统的关系型数据库,MongoDB是非关系型数据库的代表之一。要知道什么时候应该使用MongoDB,首先应该知道它具有一些什么特性,能做什么和不能做什么,然后根据具体情况决定是否使用。建议先阅读一下官方文档中的介绍部分,其中列举的是MongoDB最关键的特性,其他所有功能几乎都是围绕这些特性展开。这些特性大部分时候也是决定是否采用MongoDB的关键因素。
这里有一篇文章也简单粗暴地介绍了如何选择的问题。
然而,随着技术发展,所谓“关系型”和“非关系型”的界线已经越来越模糊,一方面Postgre、MySQL这些传统RDBMS开始支持JSON这样的非关系模型,另一方面MongoDB也开始支持JOIN,甚至将来会支持事务。既然界限变得模糊,那么什么时候应该使用哪种技术也就不能一概而论了,比较结果往往是既能用这个,又能用那个。但是你确实可以比较如果在项目中使用了某种技术,会得到什么,失去什么,然后权衡得到的部分是否能弥补损失的部分,最终决定是否采用这种技术。
数据的结构不一定的时候用mongodb最好,比如你sql数据库中要先定义所有字段的类型,名字,长度什么的,这就缺少了弹性,mongodb在某个字段数据不存在的时候就当他没有。
举个例子,假设我们的服务器要在数据库里保存系统发生的事件event。某某用户做了某某事,有时候你要纪录他发送的post的原始的body内容以备查询,有的时候又不要,那么在不需要纪录post内容的时候,假如你在sql中定义string长度为1000,就浪费了这段空间,mongodb就不会。并且在取出这条记录的时候,sql数据库会返回你定义的那个结构,即使其中的一个字段为空,而mongodb由于保存的时候就没有包含那个为空的字段,取出来的时候也同样不会有。
还有就是mongodb对于json的各种结构支持的很不错,当然这应该不是你采用mongodb的主要目的。