新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
传统观念中 NoSQL数据库非常适合某些数据类型,如:非关系数据源。同时,NoSQL被吹捧为最适合Web应用程序的优秀平台。然而他适合大多数数据,特别是web应用程序的数据是相关型。那么,这是否可以给你一个坚持使用RDMS的理由呢?也不一定,即使很困难,我们还是要做出选择。
噶尔ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
评估NoSQL是一个很茅盾的理论,一些人认为,应该将所有文档数据存储在一个文档中,做链接代码就是亵渎神明。另外一部分人认为,存储应用文档,加入代码,才是合理选择。与此同时,不同的数据库,需要在文档中限制嵌套数据数量。有的人会鼓励文档引用。这是NoSQL数据模型的基本部分,也没有一个明确的共识。
曾经有一篇很热的帖子"Why you should never use XYZ",我想,读到这里,一定会有人搜索这篇文章。当然,这种文章各式各样,太过于笼统的标题也没什么帮助。毫无疑问,会有人会搜索这个文章,然后再找
到这个文章,进一步深入,找到该文章的方法远比成功(理解问题)的故事多。很难知道谁提供了一个有效的技术问题,谁又误读了这个问题(或者缺少证据证明其观点)。
有大量选择,RDBMS的世界,选择就很容易。你有4或5个目标,大家工作方式差不多,来选择环境、预算支持的平台。对于成熟的产品,风险比较小。 NoSQL的世界,有很多数据库引擎功能选择。每一个有自己的独特优势,也有致命弱点。所以选择很难, NoSQL项目生命周期短,尝试新项目或者流行项目也会有风险。上次,我的的项目是在 CouchDB上,而现在似乎停摆了。
做出这个痛苦决定的原因是,这可能是一个案例:你需要做一大堆工作,才能知道,你做出的选择对与错。你可以实体化你的数据模型,了解他与系统的工作情况,但是,这只有你正真撞到南墙,才可以找到裂缝(答案)。以我为例,我建的应用程序是关系数据库,移动文件存储的主要因素是,需要一个无模式设计来达到我的目标。使用NoSQL 数据库存储关系型数据库并不是我们所常说的,虽然,这种事常常发生。
现在我在用 Couchbase 和 MongoDB,Mongo对我没多大吸引力,不过鉴于他非常流行,对于引起来说,很有好处。当然,很多都可以以同样的方式流行。PHP很流行,因为他的易用性,而不是因为他很好。
先把约束去掉, 可以去使约束 与 NOCHECK 状态;
ALTER TABLE 表名 NOCHECK CONSTRAINT ALL
详细点 请参见SQL SERVER 2005帮助文档。
什么是NoSQL
大家有没有听说过“NoSQL”呢?近年,这个词极受关注。看到“NoSQL”这个词,大家可能会误以为是“No!SQL”的缩写,并深感愤怒:“SQL怎么会没有必要了呢?”但实际上,它是“Not Only SQL”的缩写。它的意义是:适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。
为弥补关系型数据库的不足,各种各样的NoSQL数据库应运而生。
为了更好地了解本书所介绍的NoSQL数据库,对关系型数据库的理解是必不可少的。那么,就让我们先来看一看关系型数据库的历史、分类和特征吧。
关系型数据库简史
1969年,埃德加?6?1弗兰克?6?1科德(Edgar Frank Codd)发表了划时代的论文,首次提出了关系数据模型的概念。但可惜的是,刊登论文的《IBM Research Report》只是IBM公司的内部刊物,因此论文反响平平。1970年,他再次在刊物《Communication of the ACM》上发表了题为“A Relational Model of Data for Large Shared Data banks”(大型共享数据库的关系模型)的论文,终于引起了大家的关注。
科德所提出的关系数据模型的概念成为了现今关系型数据库的基础。当时的关系型数据库由于硬件性能低劣、处理速度过慢而迟迟没有得到实际应用。但之后随着硬件性能的提升,加之使用简单、性能优越等优点,关系型数据库得到了广泛的应用。
通用性及高性能
虽然本书是讲解NoSQL数据库的,但有一个重要的大前提,请大家一定不要误解。这个大前提就是“关系型数据库的性能绝对不低,它具有非常好的通用性和非常高的性能”。毫无疑问,对于绝大多数的应用来说它都是最有效的解决方案。
突出的优势
关系型数据库作为应用广泛的通用型数据库,它的突出优势主要有以下几点:
保持数据的一致性(事务处理)
由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处)
可以进行JOIN等复杂查询
存在很多实际成果和专业技术信息(成熟的技术)
这其中,能够保持数据的一致性是关系型数据库的最大优势。在需要严格保证数据一致性和处理完整性的情况下,用关系型数据库是肯定没有错的。但是有些情况不需要JOIN,对上述关系型数据库的优点也没有什么特别需要,这时似乎也就没有必要拘泥于关系型数据库了。
关系型数据库的不足
不擅长的处理
就像之前提到的那样,关系型数据库的性能非常高。但是它毕竟是一个通用型的数据库,并不能完全适应所有的用途。具体来说它并不擅长以下处理:
大量数据的写入处理
为有数据更新的表做索引或表结构(schema)变更
字段不固定时应用
对简单查询需要快速返回结果的处理
。。。。。。
NoSQL数据库
为了弥补关系型数据库的不足(特别是最近几年),NoSQL数据库出现了。关系型数据库应用广泛,能进行事务处理和JOIN等复杂处理。相对地,NoSQL数据库只应用在特定领域,基本上不进行复杂的处理,但它恰恰弥补了之前所列举的关系型数据库的不足之处。
易于数据的分散
如前所述,关系型数据库并不擅长大量数据的写入处理。原本关系型数据库就是以JOIN为前提的,就是说,各个数据之间存在关联是关系型数据库得名的主要原因。为了进行JOIN处理,关系型数据库不得不把数据存储在同一个服务器内,这不利于数据的分散。相反,NoSQL数据库原本就不支持JOIN处理,各个数据都是独立设计的,很容易把数据分散到多个服务器上。由于数据被分散到了多个服务器上,减少了每个服务器上的数据量,即使要进行大量数据的写入操作,处理起来也更加容易。同理,数据的读入操作当然也同样容易。
提升性能和增大规模
下面说一点题外话,如果想要使服务器能够轻松地处理更大量的数据,那么只有两个选择:一是提升性能,二是增大规模。下面我们来整理一下这两者的不同。
首先,提升性能指的就是通过提升现行服务器自身的性能来提高处理能力。这是非常简单的方法,程序方面也不需要进行变更,但需要一些费用。若要购买性能翻倍的服务器,需要花费的资金往往不只是原来的2倍,可能需要多达5到10倍。这种方法虽然简单,但是成本较高。
另一方面,增大规模指的是使用多台廉价的服务器来提高处理能力。它需要对程序进行变更,但由于使用廉价的服务器,可以控制成本。另外,以后只要依葫芦画瓢增加廉价服务器的数量就可以了。
不对大量数据进行处理的话就没有使用的必要吗?
NoSQL数据库基本上来说为了“使大量数据的写入处理更加容易(让增加服务器数量更容易)”而设计的。但如果不是对大量数据进行操作的话,NoSQL数据库的应用就没有意义吗?
答案是否定的。的确,它在处理大量数据方面很有优势。但实际上NoSQL数据库还有各种各样的特点,如果能够恰当地利用这些特点将会是非常有帮助。具体的例子将会在第2章和第3章进行介绍,这些用途将会让你感受到利用NoSQL的好处。
希望顺畅地对数据进行缓存(Cache)处理
希望对数组类型的数据进行高速处理
希望进行全部保存
多样的NoSQL数据库
NoSQL数据库存在着“key-value存储”、“文档型数据库”、“列存储数据库”等各种各样的种类,每种数据库又包含各自的特点。下一节让我们一起来了解一下NoSQL数据库的种类和特点。
NoSQL数据库是什么
NoSQL说起来简单,但实际上到底有多少种呢?我在提笔的时候,到NoSQL的官方网站上确认了一下,竟然已经有122种了。另外官方网站上也介绍了本书没有涉及到的图形数据库和对象数据库等各个类别。不知不觉间,原来已经出现了这么多的NoSQL数据库啊。
本节将为大家介绍具有代表性的NoSQL数据库。
key-value存储
这是最常见的NoSQL数据库,它的数据是以key-value的形式存储的。虽然它的处理速度非常快,但是基本上只能通过key的完全一致查询获取数据。根据数据的保存方式可以分为临时性、永久性和两者兼具三种。
临时性
memcached属于这种类型。所谓临时性就是 “数据有可能丢失”的意思。memcached把所有数据都保存在内存中,这样保存和读取的速度非常快,但是当memcached停止的时候,数据就不存在了。由于数据保存在内存中,所以无法操作超出内存容量的数据(旧数据会丢失)。
在内存中保存数据
可以进行非常快速的保存和读取处理
数据有可能丢失
永久性
Tokyo Tyrant、Flare、ROMA等属于这种类型。和临时性相反,所谓永久性就是“数据不会丢失”的意思。这里的key-value存储不像memcached那样在内存中保存数据,而是把数据保存在硬盘上。与memcached在内存中处理数据比起来,由于必然要发生对硬盘的IO操作,所以性能上还是有差距的。但数据不会丢失是它最大的优势。
在硬盘上保存数据
可以进行非常快速的保存和读取处理(但无法与memcached相比)
数据不会丢失
两者兼具
Redis属于这种类型。Redis有些特殊,临时性和永久性兼具,且集合了临时性key-value存储和永久性key-value存储的优点。Redis首先把数据保存到内存中,在满足特定条件(默认是15分钟一次以上,5分钟内10个以上,1分钟内10000个以上的key发生变更)的时候将数据写入到硬盘中。这样既确保了内存中数据的处理速度,又可以通过写入硬盘来保证数据的永久性。这种类型的数据库特别适合于处理数组类型的数据。
同时在内存和硬盘上保存数据
可以进行非常快速的保存和读取处理
保存在硬盘上的数据不会消失(可以恢复)
适合于处理数组类型的数据
面向文档的数据库
MongoDB、CouchDB属于这种类型。它们属于NoSQL数据库,但与key-value存储相异。
不定义表结构
面向文档的数据库具有以下特征:即使不定义表结构,也可以像定义了表结构一样使用。关系型数据库在变更表结构时比较费事,而且为了保持一致性还需修改程序。然而NoSQL数据库则可省去这些麻烦(通常程序都是正确的),确实是方便快捷。
可以使用复杂的查询条件
跟key-value存储不同的是,面向文档的数据库可以通过复杂的查询条件来获取数据。虽然不具备事务处理和JOIN这些关系型数据库所具有的处理能力,但除此以外的其他处理基本上都能实现。这是非常容易使用的NoSQL数据库。
不需要定义表结构
可以利用复杂的查询条件
面向列的数据库
Cassandra、Hbase、HyperTable属于这种类型。由于近年来数据量出现爆发性增长,这种类型的NoSQL数据库尤其引人注目。
面向行的数据库和面向列的数据库
普通的关系型数据库都是以行为单位来存储数据的,擅长进行以行为单位的读入处理,比如特定条件数据的获取。因此,关系型数据库也被称为面向行的数据库。相反,面向列的数据库是以列为单位来存储数据的,擅长以列为单位读入数据。
高扩展性
面向列的数据库具有高扩展性,即使数据增加也不会降低相应的处理速度(特别是写入速度),所以它主要应用于需要处理大量数据的情况。另外,利用面向列的数据库的优势,把它作为批处理程序的存储器来对大量数据进行更新也是非常有用的。但由于面向列的数据库跟现行数据库存储的思维方式有很大不同,应用起来十分困难。
高扩展性(特别是写入处理)
应用十分困难
最近,像Twitter和Facebook这样需要对大量数据进行更新和查询的网络服务不断增加,面向列的数据库的优势对其中一些服务是非常有用的,但是由于这与本书所要介绍的内容关系不大,就不进行详细介绍了。
总结:
NoSQL并不是No-SQL,而是指Not Only SQL。
NoSQL的出现是为了弥补SQL数据库因为事务等机制带来的对海量数据、高并发请求的处理的性能上的欠缺。
NoSQL不是为了替代SQL而出现的,它是一种替补方案,而不是解决方案的首选。
绝大多数的NoSQL产品都是基于大内存和高性能随机读写的(比如具有更高性能的固态硬盘阵列),一般的小型企业在选择NoSQL时一定要慎重!不要为了NoSQL而NoSQL,可能会导致花了冤枉钱又耽搁了项目进程。
NoSQL不是万能的,但在大型项目中,你往往需要它!
你好,很高兴回答你的问题。
该题的答案是A。
NoSql是区别与传统数据库存储和管理技术的一个新技术。
如果有帮助到你,请点击采纳。
一、简答题。
DBMS的中英文全称?
简单解释内连接与外连接的区别?
Alter table 与 update的区别?
二、写SQL语句。
(一)按要求创建三张表:
顾客表Customer、定购表Book 、商品表Commodity。
1. 表名:CS (Customer)
属性:ID 字符型 最大10个字符 ——顾客编号
NAME 字符型 最大16个字符 ——顾客姓名
SEX 字符型 最大2个字符 ——性别
TEL 字符型 最大11个字符 ——移动电话
ADDR 字符型 最大50个字符 ——家庭住址
约束: ID——主码; NAME——非空属性; SEX——取值“男”或“女”;
MOBILE——唯一性; ADDRESS——默认为UNKOWN;
Create table cs(
Id char(10) primary key,
Name char(16) not null,
Sex char(2) check(sex=’男’ or sex=’女’)
Tel char(11) unique,
Addr char(50) default ‘unkown’
)
2.表名:CM (Commodity)
属性:ID 字符型 最大12个字符 ——商品编号
NAME 字符型 最大20个字符 ——商品名称 (生产日期和保质期)
MANUF 字符型 最大20个字符 ——生产厂商
PRICE 小数型 最大不超过4位数,保留2位小数 ——商品单价
约束:ID——主码
create table cm(
id char(12) primary key,
name char(20),
manuf char(20),
price decimal(4,2)
)
3.表名:Book
属性:CSID 字符型 最大10个字符 ——顾客编号
CMID 字符型 最大12个字符 ——商品编号
COUNT 整型 ——定购数量
约束:CSID,CMID——主码; 定购数量要大于0;csid,Cmid是外码
create table book (
csid char(10) ,
smid char(12),
count int check(count0),
primary key(csid,smid),
foreign key(csid) references cs(id) ,
foreign key(cmid) references cm(id)
)
(二)根据如下给定的几个关系(雇员、工作、公司和经理),用SQL语句实现下列数据操作(删除和修改,不考虑参照关系)。
雇员(姓名,街道,城市)
工作(雇员名,公司名,工资)
公司(公司名,城市)
经理(雇员名,经理名)
其中,下划线表示各关系的主码,外码参照关系如下:工作表中的雇员名参照雇员表的姓名;工作表中的公司名参照公司表中的公司名;经理表中的雇员名参照雇员表的姓名。
查询公司表中的全部数据
select * from 公司
查询在大连的全部公司,结果公司名称升序排序。
Select * from 公司 order by 公司名
查询公司的名称中带有“软件”字样的,公司名称
select 公司名 from 公司 where 公司名 like ‘%软件%’
查询IBM员工的工资总合
select sum(工资) from 工作 where 公司名=‘IBM’
找出所有为“IBM”工作并且工资超过2000的员工的姓名。
Select 雇员名 from 工作 where 公司名=‘ibm’and 工资2000
找出所有工资少于3000元员工的姓名,及城市。
Select 姓名,城市 from 雇员 where 姓名 in(
Select雇员名 from 工作 where 工资3000
)
每个公司的平均工资
select avg(工资)from 工作
group by 公司名
查询最高工资少于3000元的公司名称
select 公司名 from 工作
group by 公司名
having max(工资)3000
添加记录“北京市”的“呵呵”公司到公司表。
Insert into 公司 values(‘北京’,‘呵呵’)
修改数据,使“呵呵”公司所在地为“大连”。
Update 公司 set 城市=‘大连’
Where 公司名=‘呵呵’
为“东软”所有不是经理的人加薪10%。
Update 工作 set 工资=工资*1.1
Where 雇员名 not in (select 经理名 from 经理)
And 公司名=‘东软’
删除工资多余10000的所有工作表中记录
delete from 工作
where 工资〉10000
创建在“大连”工作的所有雇员信息的视图DLEmployee,显示雇员的姓名和街道,且要求对此视图的更改要满足在“大连”工作这一条件。
Create view dlemployee
As
Select 姓名,街道
Where 城市=‘大连’
With check option
创建在“呵呵”公司工作的员工的视图“呵呵”,包括员工的姓名、街道、工资。
Create view 呵呵(姓名,街道,工资)
As
Select 姓名,街道,工资
From 雇员 join 工作 on 雇员.姓名=工作.雇员名
Where 公司名=‘呵呵’
在呵呵视图中查询在工资多余1000的雇员信息。
Select * from 呵呵 where 工资1000
在工作表上的工资列创建索引in_sal
create index in_sal on 工作(工资)
查询在公司所在地为大连的员工的居住城市
select 城市 from 雇员
where 姓名 in(
select 雇员名 from 工作
where 公司名 in (select 公司名 from 公司 where 城市=‘大连’))
找出工资总额最小的公司。
Select 公司名 from 工作
Group by 公司名
Having sum(工资)=all(
Select sum(工资) from 工作
Group by 公司名
)
下面的题目为思考题(不占本次测试的分数,但是做出来可以加分)
找出所有居住的城市和公司所在的城市相同的员工。
Select 姓名 from 雇员 join 工作 on 雇员.雇员名=工作.雇员名
Join 公司 on 公司.公司名= 工作.公司名
Where 公司.城市=雇员.城市
找出所有居住的街道和城市与其经理相同的员工。
select a.姓名 from 雇员 a join 经理 b on a.姓名=b.雇员名
join 雇员 c on b.经理名=c.姓名
where a.城市=c.城市
找出数据库中所有工资高于“IBM”的每一个员工的员工信息。
Select * from 雇员
Where 姓名 in (select 雇员名 from 工作
Where 工资 (
Select max(工资) from 工作
Where 公司名=’ibm’
)
)
找出工资高于其所在公司员工平均工资的所有员工姓名(思考题)。
Select 雇员名 from 工作 join
(Select avg(price) ,公司名 from 工作
Group by 公司名) as rr(平均工资,公司名)
On 工作.公司名=rr.公司名 and 工作.工资rr.平均工资
找出平均工资高于“东软”的平均工资的所有公司。
Select 公司名 from 工作
Group by 公司名
Having avg(工资)(
Select sum(工资) from 工作
Where 公司名=‘东软’)
删除员工的居住地及其公司所在地都是“大连”的员工在工作表中的记录。
delete from 工作
where 雇员名 in(
select 姓名 from 雇员 where 城市=’大连’
) and 公司名 in(
select 公司名 from 公司 where 城市=’大连’)
)
答案:A
1.文档型数据库
作为最受欢迎的NoSQL产品,文档型数据库MongoDB当仁不让地占据了第一的位置,同时它也是所有NoSQL数据库中排名最靠前的产品(总排行榜第七名)。Apache基金会的CouchDB排在第二,基于.Net的数据库RavenDB排在第三,Couchbase排在第四。
2.键值(Key-value)数据库
键值(Key-value)数据库是NoSQL领域中应用范围最广的,也是涉及产品最多的一种模型。从最简单的BerkeleyDB到功能丰富的分布式数据库Riak再到Amazon托管的DynamoDB不一而足。
在键值数据库流行度排行中,Redis不出意外地排名第一,它是一款由Vmware支持的内存数据库,总体排名第十一。排在第二位的是Memcached,它在缓存系统中应用十分广泛。排在之后的是Riak、BerkeleyDB、SimpleDB、DynamoDB以及甲骨文的Oracle NoSQL数据库。值得注意的是,Oracle NoSQL数据库上榜不久,得分已经翻番,上升势头非常迅猛。
3. 列式存储
列式存储被视为NoSQL数据库中非常重要的一种模式,其中Cassandra流行度最高,它已经由Facebook转交给到Apache进行管理,同时Cassandra在全体数据库排名中排在第十位,紧随MongoDB成为第二受欢迎的NoSQL数据库。基于Hadoop的Hbase排在第二位,Hypertable排在第三。而Google的BigTable并未列入排名,原因是它并未正式公开。