初识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更利于动态生成存放方式,灵活性高了很多,至少我们可以在存放数据的时候再设计数据库了(虽然可能预先设计会好一些)

当然,如果存储的不是事件性或者类似此类数据那么就另当别论了,二维表还是有很多它本身的优势的。以上是我的一些个人的分析,当然还有很多普遍认同的观点,以下是一些普遍认同的关于两种数据库模式的优缺点分析,我也基本同意。

关系性优势:
    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. 现有产品的不够成熟:大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语;

(0)

相关推荐

  • 纯Python开发的nosql数据库CodernityDB介绍和使用实例

    看看这个logo,有些像python的小蛇吧 .这次介绍的数据库codernityDB是纯python开发的. 先前用了下tinyDB这个本地数据库,也在一个api服务中用了下,一开始觉得速度有些不给力,结果一看实现的方式,真是太鸟了,居然就是json的存储,连个二进制压缩都没有.  这里介绍的CodernityDB 也是纯开发的一个小数据库. CodernityDB是开源的,纯Python语言(没有第三方依赖),快速,多平台的NoSQL型数据库.它有可选项支持HTTP服务版本(Codernit

  • NoSQL数据库的分布式算法详解

    今天,我们将研究一些分布式策略,比如故障检测中的复制,这些策略用黑体字标出,被分为三段: 数据一致性.NoSQL需要在分布式系统的一致性,容错性和性能,低延迟及高可用之间作出权衡,一般来说,数据一致性是一个必选项,所以这一节主要是关于 数据复制 和 数据恢复 . 数据放置.一个数据库产品应该能够应对不同的数据分布,集群拓扑和硬件配置.在这一节我们将讨论如何 分布 以及 调整数据分布 才能够能够及时解决故障,提供持久化保证,高效查询和保证集训中的资源(如内存和硬盘空间)得到均衡使用. 对等系统.像

  • PHP对MongoDB[NoSQL]数据库的操作

    一.MongoDB简介 MongoDB (名称来自"humongous") 是一个可扩展的.高性能.开源.模式自由.面向文档的数据库,集文档数据库.键值对存储和关系型数据库的优点于一身.官方站点:http://www.mongodb.org/,MongoDB特点: •面向文档存储(类JSON数据模式简单而强大)•动态查询•全索引支持,扩展到内部对象和内嵌数组•查询记录分析•快速,就地更新•高效存储二进制大对象 (比如照片和视频)•复制和故障切换支持•Auto-Sharding自动分片支

  • NoSQL和Redis简介及Redis在Windows下的安装和使用教程

    NoSQL简介 介绍redis前,我想还是先认识下NoSQL,即not only sql, 是一种非关系型的数据存储,key/value键值对存储.现有Nosql DB 产品: Redis/MongoDB/Memcached/Hbase/Cassandra/ Tokyo Cabinet/Voldemort/Dynomite/Riak/ CouchDB/Hypertable/Flare/Tin/Lightcloud/ KiokuDB/Scalaris/Kai/ThruDB, 等等~~~ 为什么需要

  • 8种主流NoSQL数据库系统特性对比和最佳应用场景

    曾在多家大公司任职的软件架构师兼顾问Kristóf Kovács在博客中对主流的NoSQL数据库(Cassandra.Mongodb.CouchDB.Redis.Riak.Membase.Neo4j以及HBase)进行了全方位的对比. 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举. 但是NoSQL数据库之间的不同,远超过两SQL数据库之间的差别.这意味着软件架构师更应该在项目开始时就选择好一

  • 深入解析NoSQL数据库的分布式算法(图文详解)

    尽管NoSQL运动并没有给分布式数据处理带来根本性的技术变革,但是依然引发了铺天盖地的关于各种协议和算法的研究以及实践.在这篇文章里,我将针对NoSQL数据库的分布式特点进行一些系统化的描述. 系统的可扩展性是推动NoSQL运动发展的的主要理由,包含了分布式系统协调,故障转移,资源管理和许多其他特性.这么讲使得NoSQL听起来像是一个大筐,什么都能塞进去.尽管NoSQL运动并没有给分布式数据处理带来根本性的技术变革,但是依然引发了铺天盖地的关于各种协议和算法的研究以及实践.正是通过这些尝试逐渐总

  • NoSQL反模式 - 文档数据库篇

    我们设计关系数据库Schema的都有一套完整的方案,而NoSQL却没有这些.半年前笔者读了本<SQL反模式>的书,觉得非常好.就开始留意,对于NoSQL是否也有反模式?好的反模式可以在我们设计Schema告诉哪里是陷阱和悬崖.NoSQL宣传的时候往往宣称是SchemaLess的,这会让人误解其不需要设计Schema.但如果不意识到设计Schema的必要,陷阱就在一直在黑暗中等着我们.这篇文章就总结一些别人的,也有自己犯过的深痛的设计Schema错误. NoSQL数据库最主流的有文档数据库,列存

  • NoSQL 数据库你应该了解的 10 件事

    四分之一个世纪以来,关系型数据库(RDBMS)一直是主流数据库模型.但是现在非关系型数据库,"云"或者"NoSQL"数据库,正在作为一种替代数据库模型获得越来越多的占有率.本文中我们将关注非关系型 NoSQL 数据库的 10 个关键特征:排在前 5 位的优点和前 5 位的挑战.提示:点击链接可以下载本文 英文版PDF NoSQL 的五大有点 1:弹性扩展 多年来,数据库负载需要增加时,数据管理员只能依赖于纵向扩展(scale-up)--买更多更强的服务器,而不是依赖

  • NoSQL开篇之为什么要使用NoSQL

    NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面.今年伊始,InfoQ中文站有幸邀请到凤凰网的孙立先生,为大家分享他之于NoSQL方面的经验和体会. 非常荣幸能受邀在InfoQ开辟这样一个关于NoSQL的专栏,InfoQ是我非常尊重的一家技术媒体,同时我也希望借助InfoQ,在国内推动NoSQL的发展,希望跟我一样有兴趣的朋友加入进来.这次的NoSQL专栏系列将先整体介绍NoSQL,然后介绍如何把NoSQL运用到自己的

  • 大数据时代的数据库选择:SQL还是NoSQL?

    一.专家简介VoltDB公司首席技术官Ryan Betts表示,SQL已经赢得了大型企业的广泛部署,大数据是它可以支持的另一个领域.Couchbase公司首席执行官Bob Wiederhold表示,NoSQL是可行的选择,并且从很多方面来看,它是大数据的最佳选择,特别是涉及到可扩展性时.二.SQL经历时间的考验,并仍然在蓬勃发展结构化查询语言(SQL)是经过时间考验的胜利者,它已经主宰了几十年,目前大数据公司和组织(例如谷歌.Facebook.Cloudera和Apache)正在积极投资于SQL

  • MongoDB系列教程(一):NoSQL起源

    为什么出现NoSQL? 随着互联网的发展,当我们把一台服务器一台服务器变成两台服务器,当我们开始建立数据备份,当我们需要加一个缓冲层,来调整所有的查询,投入更多的硬件. 最后,需要将数据切分多个集群上,并重构大量的应用逻辑以适应这种切分.不久之后,你就会发现被自己数月前的设计数据结构限制住了. 随着web2.0的兴起,关系型数据库本身无法克服的缺陷越来越明显,主要表现为如下几点. 1.对数据高并发读写的需求 2.对海量数据的高效率存储和访问的需求. 3.对数据库的高可扩展性和高可用性的需求. 4

  • 8 种常用的 NoSQL 数据库系统对比分析

    Kristóf Kovács 是一位软件架构师和咨询顾问,他最近发布了一片对比各种类型NoSQL数据库的文章. 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举. 但是NoSQL数据库之间的不同,远超过两 SQL数据库之间的差别.这意味着软件架构师更应该在项目开始时就选择好一个适合的 NoSQL数据库.针对这种情况,这里对 Cassandra.Mongodb.CouchDB.Redis. Ria

  • 关于NoSQL之MongoDB的一些总结

    NoSQL已经流行了很长一段时间,那么究竟是什么场景下你才更需要用到这些"新兴事物",就比如MongoDB?下面是一些总结: 你期望一个更高的写负载 默认情况下,对比事务安全,MongoDB更关注高的插入速度.如果你需要加载大量低价值的业务数据,那么MongoDB将很适合你的用例.但是必须避免在要求高事务安全的情景下使用MongoDB,比如一个1000万美元的交易. 不可靠环境保证高可用性 设置副本集(主-从服务器设置)不仅方便而且很快,此外,使用MongoDB还可以快速.安全及自动化

  • 最新统计排名前十的SQL和NoSQL数据库排行榜

    本排名根据DB Engines的排行榜得来,该排行榜从人气上分析了市场上200个不同的数据库,这里一览Top 10. 无可争议的Top 3 Oracle.MySQL及Microsoft SQL Server一直以绝对的优势霸占着排行榜的前三名,以独特的优势瓜分了市场上最多的用户. 1.  Oracle 11g 首次发行:1980年 许可机制:Proprietary 是否SQL:是 Oracle是重要商业项目的首选,同时也是市场上最古老的主流数据库产品,Oracle有4个不同的版本可用:Enter

随机推荐