初识NoSQL NoSql数据库入门 NoSql数据库基础知识
做了一年的大一年度项目了,对于关系型数据库结构还是有些了解了,有的时候还是觉得这种二维表不是很顺手。在看过一篇文章之后,对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" "99234890823" 8873729 228 2 "2013-05-24T23:25:00-0600" "lava" "99234890823" 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":"99234890823", "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":"99234890823", "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更利于动态生成存放方式,灵活性高了很多,至少我们可以在存放数据的时候再设计数据库了(虽然可能预先设计会好一些)