【数据库】mongodb和mysql的对比
把数据存储在纵横结构的表中,使用结构化查询语句(sql)访问数据
可以预先定义数据库模式(也就是存储数据的结构, 表结构之类的),可以设定规则管理表字段的间的关系(关联)
数据被存在单独的表里,不同表之间通过关联查询来关联,使数据重复量最小化
把数据存在类似JSON(KV键值对的形式)的文档中(数据在存储的时候MongoDB数据库为文档增加了序列化的操作,最终存进磁盘的其实是一种叫做BSON的格式,即Binary - JSON)
每个文档的json结构可能不一样,使用mongo查询语言访问数据
可以很直观的表现层级关系,例如一个学生记录,MySQL则不能很好地表现这种层级关系,如果需要表现学科和成绩之间的层级关系,可以用多张表,但是数据库内容更加复杂了
"_id": "1002",
"score": {
"Maths": 81,
"Chemistry": 74,
"Sport": {
"Basketball": 67,
"Badminton": 76,
}
}
mongo使用动态模式(就是不用定义结构,就可以创建记录,添加删除字段),数据是非规范化的
支持高可用和可扩展
MySQL |
MongoDB |
表 |
集合 |
行 |
文档 |
列 |
字段 |
joins |
嵌入文档或者链接 |
两者都有索引,都有主键,mongo会自动生成一个随机生成的值作为主键值(假如没指定主键的话)
市场上选择mongodb的原因
①可以快速地构建程序,处理多样化的数据(文档不需要规范化,面轻松应对数据属性多样性),可以把文档自然映射到面向对象变成语言,
避免将代码中的对象转换为关系表的复杂对象关系映射层(也就是不需要建model层,把表和对象映射)
②(灵活数据模型,自由增删字段)数据库模式可以随业务发展(这里其实和第一点是一样的),(但是也为不清楚数据库里的数据格式的运维人员带来了麻烦)
③可以在分布式数据中心中扩展,实现高可用,可扩展,mysql需要大量的定制工程。
MongoDB官方就自带一个分布式文件系统,可以很方便地部署到服务器机群上。MongoDB里有一个Shard的概念,就是方便为了服务器分片使用的。
每增加一台Shard,MongoDB的插入性能也会以接近倍数的方式增长,磁盘容量也可以很方便地扩充。
MongoDB还自带了对map-reduce运算框架的支持,这也很方便进行数据的统计。
什么时候用mysql,什么时候用mongo
①mongo不支持事务,需要复杂的多行事务,例如支付结账系统这种场景mysql关系型数据库更适合
②mongo的灵活数据模型适合提供内容,社交网络之类的,例如商品属性,评论等等
mongo和mysql一起用
也就是上面所说的,跟用户打交道的,产品属性用mongo,交易使用mysql,充分利用两者的特点。(电商平台可以用)
sql和nosql两者之间并不是为了谁替换谁,两者是不同的数据库设计思路,为了不同的需求而诞生
在游戏里使用mysql和mongo哪个好?
mongo更好,游戏的数据模型灵活,不需要mysql的结构化,也不需要关联别的表,对字段的类型也没有强烈的要求,之前用MySQL的时候都是用json存每个字段的值,字段内可以自由扩展
游戏也不需要事务
之前用mysql是因为工具成熟,通过hibernate(orm框架)就可以完成建表和增加字段,以及对象和表的映射。