完整word版《分布式数据库原理及应用》知识总结推荐文档.docx
- 文档编号:26630142
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:42
- 大小:42.47KB
完整word版《分布式数据库原理及应用》知识总结推荐文档.docx
《完整word版《分布式数据库原理及应用》知识总结推荐文档.docx》由会员分享,可在线阅读,更多相关《完整word版《分布式数据库原理及应用》知识总结推荐文档.docx(42页珍藏版)》请在冰豆网上搜索。
完整word版《分布式数据库原理及应用》知识总结推荐文档
《分布式数据库原理及应用》
知识总结
1描述关系数据库的相关概念:
1)关系数据的数据模型
包括三个方面:
a.关系数据结构
b.关系完整性原则
c.有关系运算
a.关系数据结构
1)域(Domain)域是一组具有相同数据类型的值的集合。
2)笛卡尔积(CartesianProduct)给定一组域D1,D2,…,Dn,这些域中可以有相同的。
D1,D2,…,Dn的笛卡尔积为:
D1×D2×…×Dn={(d1,d2,…,dn)|diÎDi,i=1,2,…,n}所有域的所有取值的一个组合,不能重复.。
A.元组(Tuple)笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组。
B.分量(Component)笛卡尔积元素(d1,d2,…,dn)中的每一个值di叫作一个分量。
C.基数(Cardinalnumber)若Di(i=1,2,…,n)为有限集,其基数为Mi(i=1,2,…,n).
3)关系(Relation)
A.关系。
D1×D2×…×Dn的子集叫作在域D1,D2,…,Dn上的关系,表示为:
R(D1,D2,…,Dn)
B.元组。
关系中的每个元素是关系中的元组,通常用t表示。
C.单元关系与二元关系。
当n=1时,称该关系为单元关系(Unaryrelation)。
当n=2时,称该关系为二元关系(Binaryrelation)。
D.关系的表示。
关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域。
E.属性。
关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性(Attribute)。
F.码。
候选码(Candidatekey)。
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码。
在最简单的情况下,候选码只包含一个属性。
称为全码(All-key)。
在最极端的情况下,关系模式的所有属性组是这个关系模式的候选码,称为全码(All-key)。
主码。
若一个关系有多个候选码,则选定其中一个为主码(Primarykey),
G.三类关系。
基本关系(基本表或基表):
实际存在的表,是实际存储数据的逻辑表示。
查询表:
查询结果对应的表。
视图表:
由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
b.关系完整性原则
关系完整性规则即指关系的正确性、相容性和有效性。
它是给定的关系模型中数据及其联系的所有制约和依存规则,用以限定数据库状态及状态变化,从而保证数据的正确、相容和有效。
包括1、实体完整性2、参照完整性3、用户定义的完整性。
c.有关系运算
关系的基本运算有两类:
一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),有些查询需要几个基本运算的组合,要经过若干步骤才能完成。
2)支持的数据类型
1.数值类型number、integer、folate
2.字符类型char、varchar2、long
3.日期类型date、timestamp
4.lob类型clob、blob、bfile
5.其他类型rowid、rownum
3)关系数据库的性能瓶颈
约束单机
4)ACID与事务
事务(Transaction),一般是指要做的或所做的事情。
在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
在计算机术语中,事务通常就是指数据库事务。
1、A(Atomicity)原子性。
原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
2、C(Consistency)一致性。
一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
3、I(Isolation)独立性。
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
4、D(Durability)持久性。
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
2描述NoSQL数据库的相关概念:
1)NoSQL数据库的分类
Nosql数据库基本可以分为四大类:
1.KV键值BerkeleyDB、redis、tair、memcache
2.文档型数据库(bson格式比较多)
CouchDB;MongoDB:
是一个基于分布式文件存储的数据库,由c++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
3.列存储数据库Cassandra;Hbase
4.图关系数据库Neo4J、InfoGrid
2)NoSQL数据库的特点
1.索引支持
关系型数据库创立之初没有想到今天的互联网应用对可扩展性提出如此高的要求,因此,设计时主要考虑的是简化用户的工作,SQL语言的产生促成数据库接口的标准化,从而形成了Oracle这样的数据库公司并带动了上下游产业链的发展。
关系型数据库在单机存储引擎支持索引,比如Mysql的Innodb存储引擎需要支持索引,而NoSQL系统的单机存储引擎是纯粹的,只需要支持基于主键的随机读取和范围查询。
NoSQL系统在系统层面提供对索引的支持。
2.并发事物处理
关系型数据库有一整套的关于事务并发处理的理论,比如锁的粒度是表级,页级还是行级,多版本并发控制机制MVCC,事务的隔离级别,死锁检测,回滚,等等。
3.数据结构
关系型数据库的存储引擎总是一颗磁盘B+树,为了提高性能,可能需要有insertbuffer聚合写,querycache缓存读,经常需要实现类似Linuxpagecache的缓存管理机制。
数据库中的读和写是互相影响的,写操作也因为时不时需要将数据flush到磁盘而性能不高。
简而言之,关系型数据库存储引擎的数据结构是通用的动态更新的B+树。
4.Join操作
关系型数据库需要在存储引擎层面支持Join,而NoSQL系统一般根据应用来决定Join实现的方式。
3)CAP与BASE理论
CAP理论
Consistency(一致性),数据一致更新,所有数据变动都是同步的
Availability(可用性),好的响应性能
Partitiontolerance(分区容错性)可靠性
定理:
任何分布式系统只可同时满足二点,没法三者兼顾。
BASE原理
1.基本可用2.软状态3.最终一致性(核心)
3MongoDB相关
1)MongoDB的简介
MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。
MongoDB文档类似于JSON对象。
字段值可以包含其他文档,数组及文档数组。
2)MongoDB的数据模型
文档的数据模型代表了数据的组织结构,一个好的数据模型能更好的支持应用程序。
在MongoDB中,文档有两种数据模型,内嵌(embed)和引用(references)。
内嵌
MongoDB的文档是无模式的,所以可以支持各种数据结构,内嵌模型也叫做非规格化模型(denormalized)。
在MongoDB中,一组相关的数据可以是一个文档,也可以是组成文档的一部分。
内嵌类型支持一组相关的数据存储在一个文档中,这样的好处就是,应用程序可以通过比较少的的查询和更新操作来完成一些常规的数据的查询和更新工作。
根据MongoDB文档,当遇到以下情况的时候,我们应该考虑使用内嵌类型:
1.如果数据关系是一种一对一的包含关系,例如一个文档,每个人都有一个contact字段来描述这个人的联系方式。
像这种一对一的关系,使用内嵌类型可以很方便的进行数据的查询和更新。
2.如果数据的关系是一对多,那么也可以考虑使用内嵌模型。
例如一个文档,用posts字段记录所有用户发布的博客。
在这中情况中,如果应用程序会经常通过用户名字段来查询改用户发布的博客信息。
那么,把posts作为内嵌字段会是一个比较好的选择,这样就可以减少很多查询的操作。
引用
相对于嵌入模型,引用模型又称规格化模型(Normalizeddatamodels),通过引用的方式来表示数据之间的关系。
这里同样使用来自MongoDB文档中的图片,在这个模型中,把contact和access从user中移出,并通过user_id作为索引来表示他们之间的联系。
当我们遇到以下情况的时候,就可以考虑使用引用模型了:
1.使用内嵌模型往往会带来数据的冗余,却可以提升数据查询的效率。
但是,当应用程序基本上不通过内嵌模型查询,或者说查询效率的提升不足以弥补数据冗余带来的问题时,我们就应该考虑引用模型了。
2.当需要实现复杂的多对多关系的时候,可以考虑引用模型。
比如我们熟知的例子,学生-课程-老师关系,如果用引用模型来实现三者的关系,可能会比内嵌模型更清晰直观,同时会减少很多冗余数据。
3.当需要实现复杂的树形关系的时候,可以考虑引用模型。
3)MongoDB的存储结构
存储结构分为四个层次,从小到大依次为:
键值对、文档、集合、数据库。
4)MongoDB支持的数据类型
NULL、Boolean、Number、String、RegularExpression、Array、Object、ObjectID、BinaryData、JavaScript、Data、Timestamp。
P98
5)MongoDB数据库操作的基本命令
创建自定义数据库usemyDB
使用show命令查看数据库列表showdbs
使用stats()方法统计数据库信息usetestdbstats()
删除数据库db.dropDatabase()
查看集合usetestdb.getCollectionNames()
6)MongoDB集合操作的基本命令
显式创建集合db.createCollection(“mtyDB”,{capped:
true,size:
6142800,max:
1000})
集合不存在时,隐式自动创建db.myDB.insert({“name”:
“tom”})
其他集合操作
Showcollections;
db.myDB.renameCollection(“orders2014”);
db.orsers2014.drop()
7)MongoDB文档操作的基本命令
插入操作
插入文档
MongoDB使用insert()或save()方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
实例
以下文档可以存储在MongoDB的runoob数据库的col集合中:
>db.col.insert({title:
'xx',
description:
'MongoDB是一个Nosql数据库',
by:
'xxx',
url:
'网址',
tags:
['mongodb','database','NoSQL'],
likes:
100
})
//以上实例中col是我们的集合名,如果该集合不在该数据库中,MongoDB会自动创建该集合并插入文档。
查看已插入文档:
>db.col.find()
{"_id":
ObjectId("56064886ade2f21f36b03134"),"title":
"xx","description":
"MongoDB是一个Nosql数据库","by":
"xxx","url":
"网址","tags":
["mongodb","database","NoSQL"],"likes":
100}
>
我们也可以将数据定义为一个变量,如下所示:
>document=({title:
'xx',
description:
'MongoDB是一个Nosql数据库',
by:
'xxx',
url:
'网址',
tags:
['mongodb','database','NoSQL'],
likes:
100
});
执行插入操作:
>db.col.insert(document)
WriteResult({"nInserted":
1})
>
注意:
插入文档你也可以使用db.col.save(document)命令。
如果不指定_id字段save()方法类似于insert()方法。
如果指定_id字段,则会更新该_id的数据。
更新操作
update()方法用于更新已存在的文档。
语法格式如下:
db.collection.update(
{
upsert:
multi:
writeConcern:
}
)
参数说明:
∙query :
update的查询条件,类似sqlupdate查询内where后面的。
∙update :
update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sqlupdate查询内set后面的
∙upsert :
可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
∙multi :
可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
∙writeConcern :
可选,抛出异常的级别。
实例
我们在集合col中插入如下数据:
>db.col.insert({
title:
'xx',
description:
'MongoDB是一个Nosql数据库',
by:
'xxx',
url:
'网址',
tags:
['mongodb','database','NoSQL'],
likes:
100
})
接着我们通过update()方法来更新标题(title):
>db.col.update({'title':
'xx'},{$set:
{'title':
'MongoDB'}})
WriteResult({"nMatched":
1,"nUpserted":
0,"nModified":
1})#输出信息
>db.col.find().pretty()
{
"_id":
ObjectId("56064f89ade2f21f36b03136"),
"title":
"MongoDB",
"description":
"MongoDB是一个Nosql数据库",
"by":
"xxx",
"url":
"网址",
"tags":
[
"mongodb",
"database",
"NoSQL"
],
"likes":
100
}
>
可以看到标题(title)由原来的"xx"更新为了"MongoDB"。
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置multi参数为true。
>db.col.update({'title':
'xx'},{$set:
{'title':
'MongoDB'}},{multi:
true})
save()方法
save()方法通过传入的文档来替换已有文档。
语法格式如下:
db.collection.save(
{
writeConcern:
}
)
参数说明:
∙document :
文档数据。
∙writeConcern :
可选,抛出异常的级别。
实例
以下实例中我们替换了_id为56064f89ade2f21f36b03136的文档数据:
>db.col.save({
"_id":
ObjectId("56064f89ade2f21f36b03136"),
"title":
"MongoDB",
"description":
"MongoDB是一个Nosql数据库",
"by":
"Runoob",
"url":
"网址",
"tags":
[
"mongodb",
"NoSQL"
],
"likes":
110
})
只更新第一条记录:
db.col.update({"count":
{$gt:
1}},{$set:
{"test2":
"OK"}});
全部更新:
db.col.update({"count":
{$gt:
3}},{$set:
{"test2":
"OK"}},false,true);
只添加第一条:
db.col.update({"count":
{$gt:
4}},{$set:
{"test5":
"OK"}},true,false);
全部添加进去:
db.col.update({"count":
{$gt:
5}},{$set:
{"test5":
"OK"}},true,true);
全部更新:
db.col.update({"count":
{$gt:
15}},{$inc:
{"count":
1}},false,true);
只更新第一条记录:
db.col.update({"count":
{$gt:
10}},{$inc:
{"count":
1}},false,false);
删除操作
remove()方法的基本语法格式如下所示:
db.collection.remove(
{
justOne:
writeConcern:
}
)
参数说明:
∙query :
(可选)删除的文档的条件。
∙justOne :
(可选)如果设为true或1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档。
∙writeConcern :
(可选)抛出异常的级别。
实例
以下文档我们执行两次插入操作:
>db.col.insert({title:
'xx',
description:
'MongoDB是一个Nosql数据库',
by:
'xxx',
url:
'网址',
tags:
['mongodb','database','NoSQL'],
likes:
100
})
使用find()函数查询数据:
>db.col.find()
{"_id":
ObjectId("56066169ade2f21f36b03137"),"title":
"xx","description":
"MongoDB是一个Nosql数据库","by":
"xxx","url":
"网址","tags":
["mongodb","database","NoSQL"],"likes":
100}
{"_id":
ObjectId("5606616dade2f21f36b03138"),"title":
"xx","description":
"MongoDB是一个Nosql数据库","by":
"xxx","url":
"网址","tags":
["mongodb","database","NoSQL"],"likes":
100}
接下来我们移除title为'xx'的文档:
>db.col.remove({'title':
'xx'})
WriteResult({"nRemoved":
2})#删除了两条数据
>db.col.find()
……#没有数据
如果你只想删除第一条找到的记录可以设置justOne为1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想删除所有数据,可以使用以下方式(类似常规SQL的truncate命令):
>db.col.remove({})
>db.col.find()
>
查询操作
MongoDB查询数据的语法格式如下:
db.collection.find(query,projection)
∙query :
可选,使用查询操作符指定查询条件
∙projection :
可选,使用投影操作符指定返回的键。
查询时返回文档中所有键值,只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下:
>db.col.find().pretty()
pretty()方法以格式化的方式来显示所有文档。
MongoDB的find()方法可以传入多个键(key),每个键(key)以逗号隔开,即常规SQL的AND条件。
语法格式如下:
>db.col.find({key1:
value1,key2:
value2}).pretty()
8)Java连接MongoDB的流程
1、安装MongoDBJDBC驱动程序
在java中使用mongoDB之前,首先需要拥有java连接mongoDB的第三方驱动包(jar包)
1)maven项目可通过在pom.xml中添加依赖
2)非maven项目jar包下载地址:
mongoDBjar包
2、连接数据库
将mongoDBJDBC驱动加入到项目之后,就可以对mongoDB进行操作了。
1)不通过认证连接mongoDB服务
//连接到mongodb服务
MongoClientmongoClient=newMongoClient("localhost",27017);
2)通过认证连接mongoDB服务
3)连接到数据库
//连接到数据库
MongoDatabasemongoDatabase=mongoClient.getDatabase("test");
这里的"test"表示数据库名,若指定的数据库不存在,mongoDB将会在你第一次插入文档时创建数据库。
4)封装成工具类
9)MongoDB的索引原理
简单的说,索引就是将文档按照某个(或某些)字段顺序组织起来,以便能根据该字段高效的查询。
有了索引,至少能优化如下场景的效率:
查询,比如查询年龄为18的所有人
更新/删除,将年龄为18的所有人的信息更新或删除,因为更新或删除时,需要根据条件先查询出所有符合条件的文档,所以本质上还是在优化查询
排序,将所有人的信息按年龄排序,如果没有索引,需要全表扫描文档,然后再对扫描的结果进行排序。
10)MongoDB支持的索引类型
Mong
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式数据库原理及应用 完整 word 分布式 数据库 原理 应用 知识 总结 推荐 文档