数据库:什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?
数据库 : 数据库(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 模型到关系模型的转换。
- 物理结构设计 : 主要是为所设计的数据库选择合适的存储结构和存取路径。
- 数据库实施 : 包括编程、测试和试运行
- 数据库的运行和维护 : 系统的运行与数据库的日常维护。
计算机系统组成
完整的计算机系统由硬件(hardware)和软件(software)两大部分(两类资源)组成。计算机的硬件系统是计算机系统中的物理设备,是一种高度复杂的、由多种电子线路、精密机械装置等构成的、能自动并且高速地完成数据计算的装置或者工具。
计算机的软件系统是计算机系统中的程序和相关数据,包括完成计算机资源管理、方便用户使用的系统软件(厂家提供),和完成用户对数据的预期处理功能的用户软件(用户设计并自己使用)这样两大部分。
计算机的硬、软件,二者相互依存,分工互动,缺一不可。硬件是计算机系统中保存与运行软件程序的物质基础,软件则是指挥硬件完成预期功能的智力部分。但是,计算机的硬件和软件在逻辑功能上是等效的。这就是说,由软件实现的操作,在原理上是可以由硬件来实现。同样,由硬件实现的许多操作在原理上也可以由软件的模拟来实现。
计算机硬件和软件系统的组成关系(计算机系统的层次结构)可以从如图1.1 所示的六个层次来认识。图中最下面的2层(第0层数字逻辑层、第1层微体系 结构层)属于硬件部分,最上面的3层(第3层操作系统层、第4层汇编语言层、 第5层高级语言层)属于软件部分,而中间的第2层指令系统层连接了硬件和软 件两部分,与两部分都有密切关系。
第0层:数字逻辑层。这说明实现计算机硬件的最重要的物质材料是电子线路, 是能够直接处理离散的数字信号数字逻辑电路。涉及到的计算机硬件的 基础知识就是数字逻辑和数字门电路,使用何种电路实现信息存储、信 息传送以及信息运算与加工,是这一层要解决的基本问题。
第1层:微体系结构(micro architecture)层,也可以称其为计算机裸机。计 算机的核心功能是执行程序,程序是按一定规则和顺序组织起来的指令 序列。这一层体现的是,为了执行指令,需要在计算机中设置哪些功能 部件(例如:存储、运算、输入和输出、接口和总线等部件,以及控制 器部件),每个部件又如何具体组成和怎样运行,这些部件如何实现相 互连接并协同工作等方面的知识和技术。
通常,计算机硬件系统由运算器部件(数据通路)、控制器部件、存储 器部件、输入设备、输出设备5部分组成。这个层次是计算机组成原理的 主要内容。
第2层:指令系统(instruction set)层,它介于硬件和软件之间。 这涉及到需要确定使用哪些指令,指令能够处理的数据类型和对其运算所用的算法, 每一条指令的格式和完成的功能,如何指出想要对其执行读操作或者写操作的存储器的一个存储单元, 如何指出想要执行输入或者输出操作的一个外围设备,对哪一个或二个数据进行运算, 执行哪一种运算、如何保存计算结果等。指令系统是计算机硬件系统设计、实现的最基本和最重要的依据, 与计算机硬件实现的复杂程度、设计程序的难易程度、程序占用硬件资源的多少、程序运行的效率等都直接相关, 说到底,硬件系统就是要实现每一条指令的功能,能够识别和执行由指令代码序列组成的程序。 当然,指令系统与计算机软件的关系也十分密切,指令是用于设计程序的,到了计算机内部, 全部的程序最终都是由指令系统所提供的指令代码组成的, 计算机硬件能够直接识别和执行的只能是由指令代码组成的程序。
第3层:操作系统(operating system)层。 它主要分担计算机系统中的资源管理与分配, 也向使用者和程序设计人员提供简单、方便、高效的服务。 它是使用(直接或者间接)计算机硬件指令系统所提供的指令设计出来的程序, 并把一些常用功能以操作命令或者系统调用的方式提供给使用人员。
第4层:汇编语言(assembly language)层。 计算机的硬件可以直接识别、理解的,用电子线路容易处理的就是计算机的机器语言, 又称为二进制代码语言,也就是计算机的指令。一台计算机的全部指令构成该计算机的指令系统。由此可以看出, 实质上计算机的基础硬件是在机器语言的层次上被设计与实现的,并且可以直接识别和执行的只能是由机器语言构成的程序。
汇编语言是对计算机机器语言的符号化处理(采用英文)的结果, 再增加一些为方便程序设计而实现的扩展功能。与机器语言相比, 汇编语言至少有2大优点。首先实现用英文单词或其缩写形式替代二进制的指令代码, 更容易为人们记忆和理解;其次是可以选用含义明确的英文单词来表示程序中用到的数据(常量和变量), 并且避免程序设计人员亲自花费精力为这些数据分配存储单元。如果在此基础上, 还可以在支持程序的不同结构特性(如循环和重复执行等结构), 子程序所用形式参数替换为真实参数等方面提供必要的支持。
采用汇编语言设计的程序必须经过一个叫做汇编程序的系统软件进行翻译, 将其转换为计算机的机器语言后,才能在计算机的硬件系统上予以执行。
第5层:高级语言层,高级语言又称算法语言(algorithm language), 它的实现思路,不再是过分地“靠拢”计算机硬件的指令系统, 而是着重面向解决实际问题所用的算法,为方便程序设计人员写出自己解决问题过程的程序。 目前常用的高级语言有BASIC、C、C++、,PASCAL、JAVA、PROLOG等多种。
用这些高级语言设计出来的程序,通常需要经过一个叫做编译程序的软件编译成机器语言程序, 或者首先编译成汇编程序后,再经过汇编操作后得到机器语言程序,才能在计算机的硬件系统上予以执行; 也可以由一个叫做解释执行程序的软件,逐条取来相应高级语言程序的每个语句并直接控制其完成执行过程, 而不是把整个程序编译为机器语言程序之后再交给硬件系统加以执行,解释执行程序的最大缺点是运行效率比很低。
在高级语言层之上,还可以有应用层,由解决实际问题的处理程序组成, 例如文字处理软件,数据库软件,网络软件,多媒体信息处理软件,办公自动化软件等。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。