什么是数据库(DataBase)
【分享成果,随喜正能量】生命是一段匆匆而过的旅程,只有把握好每一天,才能拥有一个实实在在的美好人生。虽然世事总是不尽如人意,但我们要设法使自己适应现状,而不是设法使一切适合自己的心意。。
《VBA数据库解决方案》教程(10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64位OFFICE系统测试。
这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:什么是数据库(DataBase)
大家好,在讲数据库之前,我用了很长的时间,和大家分享了很多VBA方面的一些知识点,其中很多是我个人对VBA的理解。从这讲开始我们要在原先的基础上深入的讲解一些VBA的提高利用,这套教程主解数据库知识。
在《VBA数据库解决方案》中,我会讲解到数据库的简单知识,数据的操作,窗体控件的利用等等。望有这方面需求的朋友多关注,多提宝贵的意见。
我们今天讲什么是数据库,或许很多朋友一听到这个词感觉很高大上,其实你大可不必仰视。
我们先看看数据库的定义,数据库(DataBase),是存储在计算机上,结构化的相关数据的集合。是长期储存在计算机内的、有组织的、可共享的数据集合。
从上面的定义可以看出:
1) 数据库是一个数据的集合。那么什么是数据呢?我们可以这样定义:用来描述事物的数字、文字、图形、图像、声音、语言等符号就是数据,数据有多种表现形式,它们都可以经过数字化后存入计算机。我们得出了这样的结论:
① 数据不一定是数字
② 数据是用来描述事物的
③ 数据是可以存储
④ 上述描述事物的数据的集合就构成了数据库
如, 姓名:张一;性别:男;年龄:55;组织:保卫处 构成了对保卫处某员工张一的描述,这个就是数据,若干这样的数据组成的集合就构成了某公司人员的数据库。
2) 数据库是有结构和有组织的。这一点又该如何理解呢?
其实,为了反映事物本身及事物之间的各种联系,数据库中的数据必须有一定的结构,这种结构用数据模型来表示,下图就是一个数据的模型。
在数据库的定义中我们讲了:数据库是具有一定结构的,那么这种结构又是靠什么来约束的呢?其实就我个人的理解,对于数据库的结构最为关键的就是要规范,也就是说:
1)用来描述事物的语言必须规范。这里把描述的语言称为事物的属性,在同一个数据库中描述同一个事物的属性必须具有共性,不能缺失。
2)在同一个数据库中,相同事物的描述不能出现多个相同的属性,就是说属性具有唯一性。
3)描述事物的属性次序无关紧要。
4)在同一个数据库资料中,如果属性值完全相同,应该是同一数据。
5)在一个数据库资料中,所描述事物的次序无关紧要。
上面的内容是比较好理解的,不再多讲。
有了上面的规范,我们再来看一下数据如何记录:
1) 描述事物的属性值的记录,就是数据库中表的记录,表也称为关系,一个关系就是一张二维表,通常将一个没有重复行、重复列的二维表看成一个关系,每个关系都有一个关系名(表名)。是数据库的核心,是所有操作的前提。
2) 关系的结构, 就是表头。 这表明了事物需要具有哪些属性,如上面的例子,在描述一个人员时的属性有:姓名;性别;年龄:组织
3) 每个事物的属性值的记录,是关系表中水平方向的行。
4) 属性值是关系表中垂直方向的列。在Access 2003中属性被称为字段,属性名叫做字段名。
5) 域(有效性规则)就是属性的取值范围
6) 关键字(主键),属性或属性的组合,其值能够唯一标识一个记录。
今日内容回向:
1 什么是数据记录?
2 什么是数据库?
3 数据库的记录的特点.
我20多年的VBA实践经验,全部浓缩在下面的各个教程中:
【分享成果,随喜正能量】世事无常,人生起落,唯有心明,才是在这修行的道场中,呵护好自己。。
数据库:什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?
数据库 : 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。
数据库管理系统 : 数据库管理系统(Database Management System 简称 DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。
数据库系统 : 数据库系统(Data Base System,简称 DBS)通常由软件、数据库和数据管理员(DBA)组成。
数据库管理员 : 数据库管理员(Database Administrator, 简称 DBA)负责全面管理和控制数据库系统。
数据库系统基本构成如下图所示:
元组 : 元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。
码 :码就是能唯一标识实体的属性,对应表中的列。
候选码 : 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为候选码。例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么{学号}和{姓名,班级}都是候选码。
主码 : 主码也叫主键。主码是从候选码中选出来的。 一个实体集中只能有一个主码,但可以有多个候选码。
外码 : 外码也叫外键。如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。
主属性 : 候选码中出现过的属性称为主属性。比如关系 工人(工号,身份证号,姓名,性别,部门). 显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。如果主码是一个属性组,那么属性组中的属性都是主属性。
非主属性: 不包含在任何一个候选码中的属性称为非主属性。比如在关系——学生(学号,姓名,年龄,性别,班级)中,主码是“学号”,那么其他的“姓名”、“年龄”、“性别”、“班级”就都可以称为非主属性。
主键(主码) :主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。
外键(外码) :外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。
对于外键和级联,阿里巴巴开发手册这样说到:
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
说明: 以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群; 级联更新是强阻塞,存在数据库更新风暴的风 险; 外键影响数据库的插入速度
为什么不要用外键呢?大部分人可能会这样回答:
增加了复杂性: a. 每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦, 测试数据极为不方便; b. 外键的主从关系是定的,假如那天需求有变化,数据库中的这个字段根本不需要和其他表有关联的话就会增加很多麻烦。
增加了额外工作: 数据库需要增加维护外键的工作,比如当我们做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,保证数据的的一致性和正确性,这样会不得不消耗资源;(个人觉得这个不是不用外键的原因,因为即使你不使用外键,你在应用层面也还是要保证的。所以,我觉得这个影响可以忽略不计。)
对分库分表不友好 :因为分库分表下外键是无法生效的。
我个人觉得上面这种回答不是特别的全面,只是说了外键存在的一个常见的问题。实际上,我们知道外键也是有很多好处的,比如:
- 保证了数据库数据的一致性和完整性;
- 级联操作方便,减轻了程序代码量;
- ……
所以说,不要一股脑的就抛弃了外键这个概念,既然它存在就有它存在的道理,如果系统不涉及分库分表,并发量不是很高的情况还是可以考虑使用外键的。
我们做一个项目的时候一定要试着画 ER 图来捋清数据库设计,这个也是面试官问你项目的时候经常会被问道的。
E-R 图 也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。 它是描述现实世界关系概念模型的有效方法。 是表示概念关系模型的一种方式。
下图是一个学生选课的 ER 图,每个学生可以选若干门课程,同一门课程也可以被若干人选择,所以它们之间的关系是多对多(M: N)。另外,还有其他两种关系是:1 对 1(1:1)、1 对多(1: N)。
我们试着将上面的 ER 图转换成数据库实际的关系模型(实际设计中,我们通常会将任课教师也作为一个实体来处理):
1NF(第一范式)
属性(对应于表中的字段)不能再被分割,也就是这个字段只能是一个值,不能再分为多个其他的字段了。1NF 是所有关系型数据库的最基本要求 ,也就是说关系型数据库中创建的表一定满足第一范式。
2NF(第二范式)
2NF 在 1NF 的基础之上,消除了非主属性对于码的部分函数依赖。如下图所示,展示了第一范式到第二范式的过渡。第二范式在第一范式的基础上增加了一个列,这个列称为主键,非主属性都依赖于主键。
一些重要的概念:
- 函数依赖(functional dependency) :若在一张表中,在属性(或属性组)X 的值确定的情况下,必定能确定属性 Y 的值,那么就可以说 Y 函数依赖于 X,写作 X → Y。
- 部分函数依赖(partial functional dependency) :如果 X→Y,并且存在 X 的一个真子集 X0,使得 X0→Y,则称 Y 对 X 部分函数依赖。比如学生基本信息表 R 中(学号,身份证号,姓名)当然学号属性取值是唯一的,在 R 关系中,(学号,身份证号)->(姓名),(学号)->(姓名),(身份证号)->(姓名);所以姓名部分函数依赖与(学号,身份证号);
- 完全函数依赖(Full functional dependency) :在一个关系中,若某个非主属性数据项依赖于全部关键字称之为完全函数依赖。比如学生基本信息表 R(学号,班级,姓名)假设不同的班级学号有相同的,班级内学号不能相同,在 R 关系中,(学号,班级)->(姓名),但是(学号)->(姓名)不成立,(班级)->(姓名)不成立,所以姓名完全函数依赖与(学号,班级);
- 传递函数依赖 : 在关系模式 R(U)中,设 X,Y,Z 是 U 的不同的属性子集,如果 X 确定 Y、Y 确定 Z,且有 X 不包含 Y,Y 不确定 X,(X∪Y)∩Z=空集合,则称 Z 传递函数依赖(transitive functional dependency) 于 X。传递函数依赖会导致数据冗余和异常。传递函数依赖的 Y 和 Z 子集往往同属于某一个事物,因此可将其合并放到一个表中。比如在关系 R(学号 , 姓名, 系名,系主任)中,学号 → 系名,系名 → 系主任,所以存在非主属性系主任对于学号的传递函数依赖。。
3NF(第三范式)
3NF 在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。符合 3NF 要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。比如在关系 R(学号 , 姓名, 系名,系主任)中,学号 → 系名,系名 → 系主任,所以存在非主属性系主任对于学号的传递函数依赖,所以该表的设计,不符合 3NF 的要求。
总结
- 1NF:属性不可再分。
- 2NF:1NF 的基础之上,消除了非主属性对于码的部分函数依赖。
- 3NF:3NF 在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。
我们可以把存储过程看成是一些 SQL 语句的集合,中间加了点逻辑控制语句。存储过程在业务比较复杂的时候是非常实用的,比如很多时候我们完成一个操作可能需要写一大串 SQL 语句,这时候我们就可以写有一个存储过程,这样也方便了我们下一次的调用。存储过程一旦调试完成通过后就能稳定运行,另外,使用存储过程比单纯 SQL 语句执行要快,因为存储过程是预编译过的。
存储过程在互联网公司应用不多,因为存储过程难以调试和扩展,而且没有移植性,还会消耗数据库资源。
阿里巴巴 Java 开发手册里要求禁止使用存储过程。
- drop(丢弃数据): drop table 表名 ,直接将表都删除掉,在删除表的时候使用。
- truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
- delete(删除数据) : delete from 表名 where 列名=值,删除某一列的数据,如果不加 where 子句和truncate table 表名作用类似。
truncate 和不带 where 子句的 delete、以及 drop 都会删除表内的数据,但是 truncate 和 delete 只删除数据不删除表的结构(定义),执行 drop 语句,此表的结构也会删除,也就是执行 drop 之后对应的表不复存在。
truncate 和 drop 属于 DDL(数据定义语言)语句,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。而 delete 语句是 DML (数据库操作语言)语句,这个操作会放到 rollback segement 中,事务提交之后才生效。
DML 语句和 DDL 语句区别:
- DML 是数据库操作语言(Data Manipulation Language)的缩写,是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。
- DDL (Data Definition Language)是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。它和 DML 语言的最大区别是 DML 只是对表内部数据的操作,而不涉及到表的定义、结构的修改,更不会涉及到其他对象。DDL 语句更多的被数据库管理员(DBA)所使用,一般的开发人员很少使用。
一般来说:drop>truncate>delete(这个我没有设计测试过)。
- 需求分析 : 分析用户的需求,包括数据、功能和性能需求。
- 概念结构设计 : 主要采用 E-R 模型进行设计,包括画 E-R 图。
- 逻辑结构设计 : 通过将 E-R 图转换成表,实现从 E-R 模型到关系模型的转换。
- 物理结构设计 : 主要是为所设计的数据库选择合适的存储结构和存取路径。
- 数据库实施 : 包括编程、测试和试运行
- 数据库的运行和维护 : 系统的运行与数据库的日常维护。
数据库系统工程师:笔记分享SQL语言8.3数据库定义
- char(n):固定长度字符串
- varchar(n):可变长度字符串,表示最多可以有n个字符的字符串
- int:整型,也可以用integer
- smallint:短整型
- numeric(p,d):定点数p为整数位,d为小数位
- real:浮点型
- double precision:双精度浮点型
- float(n):n浮点型
- boolean:布尔型
- date:日期型
- time:时间型
create table<表名>(<列名><数据类型><列级完整性约束条件><表级完整性约束条件>)
列级完整性约束条件:有NULL(空)not NULL(不为空)和unique(取值唯一);
例子:create table sc(Sno char(5),Cno char(5),grade smallint()
primary key (Sno,Cno) 主键(主码)
foreign key (Sno) references S(Sno)外码
foreign key (Cno) references C(Cno)
)
alter table<表名>(ADD<列名><数据类型><完整性约束条件>) (modify<列名><数据类型>) (drop<列名>或<数据类型>
drop table 删除表
- 索引是表中一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单
- 通过索引创建唯一索引,保证数据记录的唯一性
- 大大加快数据检索速度
- 加速表与表之间的连接
- 在使用order by 和 group by字句中进行检索数据,减少查询时间
- 使用索引,提供系统性能
- 聚集索引:指索引表中索引项的顺序与表中记录的物理顺序一致的索引
- 非聚集索引
create 【unique】【cluster】index 索引名 on 表名 列名 ASC(升序)/DESC(降序),默认ASCunique:表明索引的每一个索引值只对应唯一的数据记录cluster:表明建立聚族索引例子:create unique index Sno-Cno on sc (Sno asc , Cno desc)
drop index 索引名
- 视图不是真实存在的基本表是虚拟表
- (1)集中数据、简化、和定制用户对数据库的不同数据要求
- (2)视图可以屏蔽数据的复杂性,方便用户使用和管理数据
- (3)视图使用用户关心他特定的数据和任务
- (4)视图大大简化用户对数据的操作
- (5)视图让用户不同的方式看到不同或相同的数据
- (6)方便应用程序使用
- (3)视图提供简单而有效的安全机制
create view 视图名 (列表名)as select 查询子句【with check option】
例子:create view cs-student as select Sno ,Sname ,Sage ,Sex from student with check option
视图必须遵循的规定
- 1、子查询可以是任意复杂的select语句,但不允许含有order by字句和distinct短语
- 2、with check option表示对update、inster、delete操作时保证更新、插入或删除的行满足视图定义中的谓词条件
- 3、组成视图的属性列名或者全部省略或者全部指定
drop view 视图名
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。