原文请详见:http://www.ucai.cn/blogdetail/7033?mid=1&f=5php
可以在线执行查看效果哦!html
今天这堂课,分为三个大点,正如标题所指出的,是讨论数据的本质、概念与应用实践。第一点本质的探讨是站在一个更高的高度来分析数据的产生以及各类使用场景,而后将数据相关的存储手段,做一个汇总解说。而概念,则是一个串讲,主要放在关系数据库上,因为咱们六月份公开课,也将以关系型数据库为主。第三点就是经过一些实例来巩固前面两点所讲的内容。mysql
1、数据库的出现源起和本质redis
1.1 数据库的起源sql
想像一下咱们的电脑,有文件夹,有文件,文件有大小,有位置,有格式,这个是有文件系统開始就有这个概念的,确定在有一个地方,存储了这些文件的參数或者元数据,而在咱们的平常生活中,每一个物体和人,都有其各自不一样的特征,当一批量的这些可描写叙述的人的特征,想要数据化存储起来的时候,也就需要有一种格式来保存。除了保存数据以外,咱们还得对数据进行管理。这就是数据库出现的背景,并且随着使用场景的越加复杂,数据库自己也有了不少其它的衍生版本号。数据库
因此数据库起源于对数据的存储以及管理。数组
1.2数据库的使用场景缓存
那么咱们有几个问题,基于你们眼下的理解,第一个问题是有哪些需要保存的数据种类,有哪些存储方式呢?咱们发散一点来想。微信
可以获得例如如下的状况:网络
A、在程序中本身定义,比方数组,仅仅保存在内存里,等程序中止了以后,数据就没有了。这样可以不可以?
在这个里面存储的反正是描写叙述型数据,也可以是二进制数组。
B、保存在一个文本文件中可以不可以,有本身的格式,比方本身定义的格式,比方XML,比方JSON格式
这里保存的,仅仅能是描写叙述型数据。
C、採用一些文件型数据库,比方支持SQL訪问的文本数据库,比方Sqlite、比方Access
除了特定的数据类型,通常也仅仅保存文本描写叙述数据。
D、採用 MySQL 这样基于网络和可分布式的数据库系统。
用来保存较多数据量的用户数据、关系数据、交易数据,这些数据要实再高速查询更新。
E、当数据量大时,一台设备就不能知足要求,这就需要用到分布式数据库,多是数据集群。
F、採用 memcached 这种软件保存着缓存的数据。
通常用于保存文本数据或者计数。
G、採用 fastdfs 这种分布式文件系统来保存着文件数据。
不用于保存除文件自己描写叙述以外的其它描写叙述数据,用于保存大量的文件。
H、採用redis 这种KVDB 软件来保存简单关系的描写叙述数据,或者特定的结构。
比方用于保存微博数据,用KEY可以迅速定位到微博内容。
I、同KVDB相似的,你们有听过队列那几讲的同窗吗?是否是也是特殊的数据存储手段呢?一边有人生产数据,一边有人消费数据。
J、用于保存地理关系数据,并提供运算。在英文里叫SpatialData,也就是空间数据。Oracle最擅长,现在MySQL也有空间扩展。
http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html
K、而对于大量的,源源不断的海量数据,相对不那么规则的数据存储,咱们可能存储在Hadoop系统中。
L、最后再谈一个场景,像百度这种搜索引擎,他会把他的数据全放在MySQL里,而后去检索吗?显然不是。有自有的索引格式和支持分布式查询的系统。
总结一下:
A、在电脑时代曾经,人类就产生了大量的信息,而电脑时代以来,更是产生了大量的数字化的数据。而这些数据库的保存的形式,从上面可以看到,根据不一样的场景,不一样的保存方式,是多种多样的。有仅在内存中保存,有在文件里保存,有专用严谨的数据库系统保存,也有不那么严谨的KVDB保存。
B、依据上面的各类存储场景,咱们对数据,也作两个简单的分类,一个是结构化数据库和非结构化数据的分类,固然,还有再加一种半结构化数据的。所谓结构化,就是很是规整地有属性的一种状况。像一我的,他有身高、体重、年龄,这个描写叙述是结构化的,你给照一张照片,录一段声音,拍一段摄像,虽然这也是数据,但是不是结构化的。对于不一样的这两类数据,存储方式也不一样样,比方结构化数据是典型的二维表的结构。而非结构化数据就是仅仅以原始数据的形式存储。
上面的场景,大可能是结构化数据的处理场景,像文本数据库、MySQL数据库。而在fastdfs上,Hadoop上,就有大量的非结构化数据的存储。
C、依据数据量自己的大小,咱们也可以作一个分类。或者特定的技术应用场景。
比方小数据量数据,咱们可能为了方便,就以文本的方式来保存。而对于一个正规的提供服务的站点,像用户数据,比方优才网的用户数据,就会用MySQL数据库来保存,为了訪问速度,也会用到memcached这种缓存软件。也会用fastdfs来保存小文件。而当有大量的日志等数据量产生,需要进行数据分析的时候,比方天天的数据量以几百G,T来计的时候,就会用Hadoop 这种软件。
因此,不一样的数据量也使用不一样的保存方式。小型数据、大中型数据、海量数据或者大数据。
D、第四个角度就是从上面可以看出,数据的存储方式,有很是多类别,不一样类别适用于不一样的场景。数据库是很是强大的,但是不是所有的场景都合适使用数据库。比方上面讲的全文检索的场景,通常需要用特定的存储,特定的索引方式。假设详细地讲,全文检索中,使用的一种索引,叫倒排索引。
2、数据库有哪些概念
好的,聊完了数据以及相关软件的一些使用场景,对于不一样场景下使用不一样软件有了概念。如下咱们来介绍一下,在数据库的领域常用的一些术语,这些术语,在咱们的整个数据库学习中都要用到。
由于公开课的时间问题,咱们主要交流一下基本概念,对于高级的概念,后面的公开课会持续地讲到。
2.1 数据库的基本概念
介绍咱们如下数据库的这些概念时,咱们以一个公司作为对照。
2.1.一、库
库,就相对于一个公司,如下差点儿所有的概念都装在这个公司里的。
在使用数据库以前,咱们得在数据库软件上建立数据库。
在 MySQL 里,同一个链接,仅仅能附着在同一个库上,固然,仅仅要权限赞成,也可以实现跨库查询。
建立数据库的语法是
createdatabase xxx;
仅仅有root 用户能建立库。
2.1.二、表
表就相对于,公司的一个部门,这个部门管用户,那个部门管订单。就是一个又一个的表。
表由记录和字段组成。
字段表成的是表定义。
记录组成的是表数据。
CREATE TABLE `hstesttbl` ( `k` int(11)NOT NULL AUTO_INCREMENT, `v`char(255) NOT NULL DEFAULT '', PRIMARY KEY(`k`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
字段定义则有字段名,字段类型,是否为空,是否自增加,缺省值等。
记录则是实际的数据值,同一个表的记录的定义都是同样的。也就是说有一样的特征。
2.1.三、视图
视图类就至关于虚拟的项目小组,可以是同一个部门出来的,也可以是跨部门的。
视图之因此说是虚拟,因为没有实际存在的数据。无论是定义,仍是数据,都是从别的表里组合起来的。
create view hsview as select * from hstesttbl; mysql> show tables; +--------------------+ | Tables_in_hstestdb | +--------------------+ | hstesttbl | | hsview | +--------------------+ 2 rows in set (0.02 sec) mysql> show create table hsview\G; *************************** 1. row*************************** View: hsview Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQLSECURITY DEFINER VIEW `hsview` AS select `hstesttbl`.`k` AS `k`,`hstesttbl`.`v`AS `v` from `hstesttbl`
从上面的命令可以看出,视图跟表的操做有很是多类似。并且从表到视图还能改动字段名。
2.1.四、索引
索引就是至关于部门每个员工的一些用于高速找到员工的属性。比方职位,比方爱好,比方毕业学校。经过这些,就能将部门的人分类,每一次查询都能缩小结果集。
对表建立索引是,比方仍是上面这个表, alter table hstesttbl add index(xxx);
2.1.五、键
键就至关于部门每个人的一些最快捷且惟一的联络方式,比方电话、邮箱,微信号,QQ号都是。
加入键跟加入索引,相似,删除键这里介绍一下,
比方:
alter table hstesttbl drop primary key;
2.1.六、权限
是指公司内部限制的一些纪律,比方公司外部人,是不能知道公司内部的一些事情的。
咱们可以经过
grantALL PRIVILEGES on dbname.* to 'user'@'127.0.0.1' identified by 'password' withgrant option;
这种语句给某用户受权,全权訪问某个库。这个这个用户仅仅能訪问这个库,在没有得到不少其它受权的状况下。
上面说仅仅有root用户能建立数据库,而对于上面的其它操做,比方建立表,加入视图,新建、删除索引和键,仅仅要通过了上面的受权,就可以作了。
2.1.七、SQL
SQL就至关于公司的一些规定,指令。比方咱们在公司里交流说,可以公布到生产环境了。听起来一句简单的话,包括着可能进行了产品确认,各类測试,可以由运维上线了。
SQL是咱们同数据库打交道的指令。上面事实上在讲各个概念时,已经都讲过了一些SQL命令,我想这里提几个点。
手写命令,很重要,优才网要求本身的学员都要有手写命令的能力,不能离开phpmyadmin就没有办法干活。
SQL上面虽然介绍了这么多,咱们对它进行一个分类,事实上这个分类早有人作了。主要是为DDL、DML、DCL(固然另外一个TCL,咱们今天不讲)。
(1)数据定义。(SQL DDL)用于定义SQL模式、基本表、视图和索引的建立和撤消操做。上面的,大可能是DDL。
(2)数据操纵。(SQL DML)数据操纵分红数据查询和数据更新两类。数据更新又分红插入、删除、和改动三种操做。这就是咱们寻常所熟知的增删改查操做。
(3)数据控制(DCL)。包含对基本表和视图的受权,完整性规则的描写叙述,事务控制等内容。这个就是咱们上面也有涉及,权限处理。
2.2 学术性的概念
•一、范式与冗余
–第一范式,列不可以切割,比方兴趣字段,它里面,可能写了篮球、电影等多项。原则上来说,这个表是不知足第一范式的。应该专门创建一个用户兴趣表,有uid和兴趣。而后一我的有多条记录。因此在数据库字段定义时,需要显式地指明数据类型,除了文本类型以外,你很是难往一个字段里附加多个信息。
–第二范式,主键决定了其它全部属性,比方一个班级学生表,一个学号,决定了学生其它的信息,比方有一个表,里面有学号、学院编号、学生姓名、年龄、学院、院长。学号和学院编号是主键,看起来没有错,学生在这个学院编号里,决定了哪一个学院,院长是谁谁谁。只是这是不知足第二范式的,因为学院和院长不是由学号这个主键来决定的,而是由学院编号来决定的。因此要分拆。
–和三范式,其它属性全由主键决定, 比方仍是上面这个表,里面有学号、学院编号、学生姓名、年龄、学院、院长。学号是主键,看起来没有错,学生在这个学院里,院长是谁谁谁。只是这是不知足第二范式的,因为院长不是由学号这个主键来决定的,而是由学院来决定的。因此要分拆。
•二、ACID:
–原子性 (Atomicity) , 不可中间失败。比方说,咱们买东西,一边是买家付款,从买家帐户扣除,还有一边是存钱入卖家帐户,这分了两步,这不是原子的。因为可能中间失败。比方扣钱成功,存钱未成功。
–一致性(Consistency),仍是上面这个样例,交易完毕后,数据一致,收支相抵。不能一边多,一边少。
–隔离性(Isolation),避免并发混乱,很是多数据,一个客户訪问时没有问题,多个用户在高并发时訪问,也要知足数据不会错乱。
–持久性(Durability),永久保存,就是不要丢失。不能一关机没有了,即便丢一条也不成。
一、存储引擎 、事务、复合索引、链接池、备份、恢复
二、主从复制、行锁定、表锁定、慢查询、二进制日志、暂时表、内容分发、同步、数据库分区、分库、分表、水平拆分、垂直拆分
这不少其它的高级术语,咱们在后面再交流,或者在全栈project师课程中再交流。