初识NoSQL 快速认识NoSQL数据库 分析Analytics For Hackers: How To Think About Event Data
做了一年的大一年度项目了,对于关系型数据库结构还是有些了解了,有的时候还是觉得这种二维表不是很顺手。在看过一篇文章之后,对NoSQL有了初步的了解,(https://keen.io/blog/53958349217/analytics-for-hackers-how-to-think-about-event-data)。这边文章写的很好,确实写出来了在实际情况下NoSQL的“用武之地”,而且用了MineCraft作分析,但是也许不够全面。比如文章中只是提到了,entity数据用关系型怎么存,event数据用NoSQL怎么存,我想借我这篇文章,来分析一下event类型的数据原始的关系型数据库是怎样存数据的,然后再对这两种储存方式做一种对比,算是对原文都一种补充吧。
对于这种死亡事件,有这样的两条数据,一个是关于creeper的爆炸,一种是掉进岩浆。如果必须用关系型二维表数据库,我会这样存储。(如果您还不知道是什么样的数据,可以先看之后的NoSQL储存方法,那样看起来更清楚。)
这种情况的数据可以说是数据库设计中比较复杂的一种情况了,因为它包含两种情况(当然不止这两种情况,那么就会产生更多的结构),不同情况的数据表结构是不同的,这非常麻烦。我们一般的解决方案是设计四个表格,利用关系型数据库的关系性。设计如下四张表格。(在这里我就简写了)
第一张表
id #首先用于关联,主表需要有个id,这个倒不是什么区别,因为NoSQL一般也会有个_id的预设
timestamp #所有共同部分就可以存在一张表中。
cause
player_UID
player_experience
player_age #对于player_inveneory_id 因为这是一个可以任意长度的数组,又只能保存在另一个表中了
第二张表(用于保存creeper死亡方式的死亡事件的)
id #这是这张表的id以后可以跟别的表格关联
mid #用于关联主表
enemy_type
enemy_power
enemy_distance
enemy_age
第三张表(用于保存lava死亡方式的死亡事件的)
id #这是这张表的id以后可以跟别的表格关联
mid #用于关联主表
place_x
place_y
place_z
第四张表(用于保存player_inveneory)
id #这是这张表的id以后可以跟别的表格关联
mid #用于关联主表
inveneory
至此关系性数据库就将这种有不同结构的事件存放方式规定好了,接下来存放如下(我就不画表格了)
1.
id timestamp cause player_UID player_experience player_age
1 "2013-05-23T1:50:00-0600" "creeper" "" 8873729 228
2 "2013-05-24T23:25:00-0600" "lava" "" 88737 22 2.
id mid enemy_type enemy_power enemy_distance enemy_age
1 1 "creeper" .887 3.34 .6677 3.
id mid place_x place_y place_z
1 2 45.366 -13.333 -39.288 4.
id mid inveneory
1 1 "diamend sword"
2 1 "torches"
3 2 "stone"
至此,我们就用关系性数据库将这两个事件数据存下了。(好麻烦是吧!)
我们再看NoSQL的储存方法,因为每条数据并不受字段(列名)限制,完全可以直接保存,不用分表。(比如JSON格式)
#第一条数据
{
"timestamp": "2013-05-23T1:50:00-0600",
"cause":"creeper",
"enemy":{
"type":"creeper"
"power": .887
"distance_from_player":3.34
"age":.6677
},
"player": {
"UID":"",
"experience": 8873729,
"age": 228,
"inveneory":["diamend sword","torches"]
}
}
#第二条数据
{
"timestamp": "2013-05-24T23:25:00-0600",
"cause":"lava",
"place":{
x:45.366
y:-13.333
z:-39.288
}
"player": {
"UID":"",
"experience": 88737,
"age": 22,
"inveneory":["stone"]
}
}
下面我们分析NoSQL对这种数据存放方式的好处
1.首先是把分散的表结构整合了,让应该在一起的数据在一起了。
这就像C语言中开多个数组储存还是用一个结构体数组的区别,将一些有关系的数据放在一起是人类一种自然的想法,当然会让人更加舒服,而且可以提高关联性和升级扩展的简易程度。
2.存放变得方便
让我们来考虑有数据来了我们怎么储存。
对于二维表数据库:
1.分析数据是那种类型的
2.存放主表数据,并获得返回id
3.分支,加上主表id在不同情况下向lava或creeper表中存放数据
4.开循环,向inveneory表中插入多条记录
这还只是一个简述,还要考虑到对多个表格操作时的数据回滚问题,实际写起来30行左右,那么出错的可能就大大提高了。
对于NoSQL类型
一句话:
insert(data);#伪码
其实想想便知道,取数据时原来的关系性数据库也会同样麻烦。
3.NoSQL更利于动态生成存放方式,灵活性高了很多,至少我们可以在存放数据的时候再设计数据库了(虽然可能预先设计会好一些)
当然,如果存储的不是事件性或者类似此类数据那么就另当别论了,二维表还是有很多它本身的优势的。以上是我的一些个人的分析,当然还有很多普遍认同的观点,以下是一些普遍认同的关于两种数据库模式的优缺点分析,我也基本同意。 以下观点主要引自(http://blog.csdn.net/chenhuajie123/article/details/9374969)
关系性优势:
1.事务处理---保持数据的一致性;
2.由于以标准化为前提,数据更新的开销很小(相同的字段基本上只有一处);
3.可以进行Join等复杂查询。
关系型缺点:
1. 扩展困难:由于存在类似Join这样多表查询机制,使得数据库在扩展方面很艰难;
2. 读写慢:这种情况主要发生在数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发问题,所以导致其读写速度下滑非常严重;
3. 成本高:企业级数据库的License价格很惊人,并且随着系统的规模,而不断上升;
4. 有限的支撑容量:现有关系型解决方案还无法支撑Google这样海量的数据存储;
NoSQL优势,主要体现在下面几点:
1. 简单的扩展:典型例子是Cassandra,由于其架构是类似于经典的P2P,所以能通过轻松地添加新的节点来扩展这个集群;
2. 快速的读写:主要例子有Redis,由于其逻辑简单,而且纯内存操作,使得其性能非常出色,单节点每秒可以处理超过10万次读写操作;
3. 低廉的成本:这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本;
NoSQL数据库还存在着很多的不足,常见主要有下面这几个:
1. 不提供对SQL的支持:如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移成本;
2. 支持的特性不够丰富:现有产品所提供的功能都比较有限,大多数NoSQL数据库都不支持事务,也不像MS SQL Server和Oracle那样能提供各种附加功能,比如BI和报表等;
3. 现有产品的不够成熟:大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语;
初识NoSQL 快速认识NoSQL数据库 分析Analytics For Hackers: How To Think About Event Data的更多相关文章
- SQL与NoSQL区别--商业SQL数据库衰落--oracle面临困境
转自:商用数据库之死:Oracle 面临困境 这二十年来,商业数据库市场仍然是 IT 行业最稳定.最具黏性的领域之一,Oracle.IBM 和微软三家厂商瓜分了 80% 的份额.然而,我们认为这个领域 ...
- 非关系型数据库(NOSQL)和关系型数据库(SQL)区别详解
前言: 在我们的日常开发中,关系型数据库和非关系型数据库的使用已经是一个成熟的软件产品开发过程中必不可却的存储数据的工具了.那么用了这么久的关系数据库和非关系型数据库你们都知道他们之间的区别了吗?下面 ...
- mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析、统计功能,此外还支持本地集群部署管理.
mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析.统计功能,此外还支持本地集群部署管理 https://www.cnblogs.com/littleatp/p/9 ...
- Mysql基础(一):Mysql初识、基本指令、数据库密码相关、创建用户及授权
来源:https://www.cnblogs.com/liubing8/p/11432534.html 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 ...
- 数据库01 /Mysql初识、基本指令、数据库密码相关、创建用户及授权
数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 2. 数据库管理系统/DBMS ...
- MySQL与NoSQL——SQL与NoSQL的融合
来源:http://www.cnblogs.com/sunli/archive/2011/05/11/mysql-nosql.html 写这一篇内容的原因是MySQL5.6.2突然推出了memcach ...
- HandlerSocket ---MySQL与NoSQL ---SQL与NoSQL的融合(转)
项目地址:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL 写这一篇内容的原因是MySQL5.6.2突然推出了memcached的功能 ...
- 【风哥干货】快速解决Oracle数据库故障必备的20个脚本与命令
1.操作系统性能(通常故障出现时最先检查的内容)top.topas.vmstat.iostat.free.nmon 2.万能重启方法 如应急情况,需要重启数据库:tail -100f <对应路径 ...
- 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
随机推荐
- Python笔记(一)
我是一名211高校软件工程大三学生,由于前段时间一直在找实习公司.笔试面试了很多公司,虽然有一定的基础,但是还是被某些公司面试官像虐狗一样的虐了.最后找到了一个口碑比较好的外企,主攻信息安全方面.这段 ...
- Solr的检索运算符 (转载)
1. “:” 指定字段查指定值,如返回所有值*:*2. “?” 表示单个任意字符的通配3. “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)4. “~” 表示模糊检索,如检索拼写类 ...
- Android SQLite 的简单实例
1.前言: 今天再一次去蹭了一下某老师的android课,这一次讲的是Android的SQLite的使用,老师当场讲解了他自己做的例子. 回来之后,我春心萌动,不得不拿着参考资料再做了一个类似的例子, ...
- Spring-boot & spring.security
spring.security提供了一种身份认证框架,开发者可以在这个框架中实现各种方式的用户身份管理,比如:LDAP.MYSQL.OAUTH.Mongo等等. spring.security认证步骤 ...
- Oracle数据库SQL优化
SQL优化的最终目的是用户体验-在最短时间内让用户在页面数据.因此,执行时间是SQL优化的重要指标.在SQL查询中,I/O操作最占系统性能的.I/O操作量越大,时间越久.减少I/O操作量是优化SQL的 ...
- C#调用C++的DLL搜集整理的所有数据类型转换方式
//C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byt ...
- poj 1698 Alice's Chance 最大流
题目:给出n部电影的可以在周几拍摄.总天数.期限,问能不能把n部电影接下来. 分析: 对于每部电影连上源点,流量为总天数. 对于每一天建立一个点,连上汇点,流量为为1. 对于每部电影,如果可以在该天拍 ...
- [__NSCFNumber length]: unrecognized selector sent to instance 0x8b3c310
出现这种问题一般是你把int类型的数值赋给了NSString. 比如: 你定义了一个NSString类型的属性sex,但是服务端返回的sex字段实际上是NSNumber类型, 你直接把NSNumber ...
- DevExpress使用之ChartControl控件绘制图表(多坐标折线图、柱状图、饼状图)
最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...
- JS测试浏览器类型的代码
function getOs(url,title) { var OsObject = ""; if(navigator.userAgent.indexOf("MSIE&q ...