关系型数据库与 NoSQL 对比

关系型数据库与 NoSQL 对比 一、关系型数据库? 1.概念 关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。 主要代表:SQL Server,Oracle,Mysql,PostgreSQL。 2.优点 (1).容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。 (2)使用方便,通用的sql语句使得操作关系型数据库非常方便。 (3)易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。 3.瓶颈 (1 )海量数据的读写效率。 对于网站的并发量高,往往达到每秒上万次的请求,对于传统关系型数据库来说,硬盘I/o是一个很大的挑战。 (2) 高扩展性和可用性。 在基于web的结构中,数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。 传统数据库操作涉及事物机制,每次写入操作需要进行undo、redo操作,然后将redo操作记录到日志文件,有事物开销,不适合写多读少的场景. 二、从关系型到非关系型 关系型数据库的最大优点就是事务的一致性,这个特性,使得关系型数据库中可以适用于一切要求一致性比较高的系统中。比如:银行系统。 但是在网页应用中,对这种一致性的要求不是那么的严格,允许有一定的时间间隔,所以关系型数据库这个特点不是那么的重要了。相反,关系型数据库为了维护一致性所付出的巨大代价就是读写性能比较差。而像微博、facebook这类应用,对于并发读写能力要求极高,关系型数据库已经无法应付。所以必须用一种新的数据结构存储来替代关系型数据库。所以非关系型数据库应用而生。 三、非关系型 1.概念 NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。 NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。 2.NoSQL 命名的含义 NoSQL 并不是「完全不用 SQL」,而是不以关系模型为核心。NoSQL 的字面含义经过了演变: 早期理解为 “No SQL”,意指不使用 SQL 后来业界更倾向解读为 “Not Only SQL”,即「不只是 SQL」,强调对关系型数据库的补充而非替代 区分一个数据库是不是 NoSQL,关键看数据模型(是否以关系/表来组织数据),而不是查询语言的语法。事实上很多 NoSQL 数据库都提供了类 SQL 的接口,例如: Cassandra 有 CQL(Cassandra Query Language),语法与 SQL 非常接近 MongoDB 持续增强聚合查询能力 ClickHouse 支持 SQL 语法,但底层是列式存储,不基于关系模型 3.分类 (1)面向高性能并发读写的key-value数据库 主要特点是具有极高的并发读写性能,例如Redis、Tokyo Cabint等。 (2)面向海量数据访问的面向文档数据库 ...

Created 21216-02-21 · Updated 8086-06-08 · 1 min · 115 words · -

子查询

子查询 子查询是多表查询的一种形式。子查询就是次要查询,它返回的结果数据被用 于主查询的条件中。它返回的结果可以是一行或多行。比如: 例1//返回一条记录 select * from emp where deptno=(select deptno from dept where dept_name=‘SALES’) 例2//返回多条记录 select * from emp where deptno in (select deptno from dept where dept_addr=‘北京’) 由上例可以看出,子查询并不要求两个表有相关字段,只要得到子查询的结果集 就行,用于主查询,而连接查询,则必须要求两个表有相关字段。 2.连接查询是对两个表逐记录 (一行一行地) 进行相关查询,例1可写为连接查询 ,例2不可以写为连接查询,因为子查询返回多行记录。 select * from emp a, dept b where a.deptno= b.deptno and b.dept_name=‘SALES’ 上述形式为内连接,还有外连接 oracle中的字段后面有加号是什么意思,多说一点详细一点 a.emp_no = b.emp_no (+) 不论把(+)写在等号左边项还是右边项,统称为外连接 在内连接中,只返回那些在连接表中有匹配数据的数据行 外连接即在被连接的表中加入一个空行来与没有匹配行的数据进行匹配 比如查询员工所属的部门,总裁不属于任何部门, (老板不属于任何部门,dname 项是空的) select e.emp_name ename,d.dept_name dname from emp e, dept d where e.dept_no=d.dept_no(+) ename dname —————————— sam SALES ...

Created 19196-06-19 · Updated 19196-06-19 · 1 min · 81 words · -

sql group by having

‘sql group by having’ http://www.cnblogs.com/wang-123/archive/2012/01/05/2312676.html sql中的group by 用法 Group By 语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)"。 -它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 -注意:group by 是先排序后分组; -举例子说明: 如果要用到group by 一般用到的就是"每这个字" 例如说明现在有一个这样的表: 每个部门有多少人 就要用到分组的技术 select DepartmentID as ‘部门名称’, COUNT(*) as ‘个数’ from BasicDepartment group by DepartmentID -这个就是使用了group by +字段进行了分组,其中我们就可以理解为我们按照了部门的名称ID -DepartmentID将数据集进行了分组;然后再进行各个组的统计数据分别有多少; -如果不用count(*) 而用类似下面的语法 select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID -将会出现错误 -消息 8120,级别 16,状态 1,第 1 行 -选择列表中的列 ‘BasicDepartment.DepartmentName’ 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。 -这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面, -作为分组的依据;要么就要被包含在聚合函数中。 -出现的错误详解:咱们看看group by 的执行的过程,先执行select 的操作返回一个程序集, -然后去执行分组的操作,这时候他将根据group by 后面的字段 -进行分组,并且将相同的字段并称一列数据,如果group by 后面没有这个字段的话就要分成好多的数据。 ...

Created 19196-01-19 · Updated 19196-01-19 · 2 min · 228 words · -