数据库理论杂谈(一):基础理论

【引言】其实工作这么些年时间不算短了,但说来惭愧,从还没毕业就懵懵懂懂的接触过数据库,但直到现在,对数据库的了解也还仅仅停留在小学生水平!作为一个菜鸟,既然不想一直这么菜下去,那么就从最最基础的部分开始建立属于自己的完整的知识结构吧。


说在前面

  数据库技术是应数据管理任务的需要而产生的。数据管理经历了三个阶段:人工管理阶段、文件管理阶段、数据库系统阶段。数据库系统与其他两个系统比,有许多优点:1)数据结构化 ;2)数据的共享性高,冗余度低,易扩充;3) 数据独立性高;4)数据DBMS统一管理和控制。
  数据库是基于数据模型的,而数据模型有以下三要素:数据结构(由范式约束的数据结构定义)、数据操作(SQL)、数据完整性约束(三大完整性)。

数据库的概念

什么是Database?

  Database,就是数据库;其实使用数据库有些年头了,但真的让我们描述一下数据库是什么,还真的一时会无从说起。数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。所谓“数据库”即以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。(来自:百度百科)
  更多参考:A database is an organized collection of data, generally stored and accessed electronically from a computer system. Where databases are more complex they are often developed using formal design and modeling techniques.(来自:维基百科)

什么是DBMS?

  DBMS,对应的英文全称database management system,也就是数据库管理系统,是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。
  更多参考:The database management system (DBMS) is the software that interacts with end users, applications, the database itself to capture and analyze the data and provides facilities to administer the database. The sum total of the database, the DBMS and the associated applications can be referred to as a “database system”. Often the term “database” is also used to loosely refer to any of the DBMS, the database system or an application associated with the database.
  作为我们开发人员常说的MySQL、Oracle,其实都是数据库管理系统,而我们通常就简称数据库。

数据库的分类

关系型数据库

  关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。 关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。
  通俗的说,关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。比如比较常见的产品有:Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL等等。
  针对关系型数据库,我们经常使用的是ER图来进行描述;实际上它的全称是实体关系模型(Entity-Relationship Model),简称E-R Model,是陈品山(Peter P.S Chen)博士于1976年提出的一套数据库的设计工具,他运用真实世界中事物与关系的观念,来解释数据库中的抽象的数据架构。实体关系模型利用图形的方式(实体-关系图(Entity-Relationship Diagram))来表示数据库的概念设计,有助于设计过程中的构思及沟通讨论。
  另外一个在关系型数据库中常见的概念就是SQL语言,SQL(Structured Query Language)语言是1974年由Boyce和Chamberlin提出的一种介于关系代数与关系演算之间的结构化查询语言,是一个通用的、功能极强的关系型数据库语言。

非关系型数据库

  既然前面讲了关系型数据库的概念,那么必然我们想到肯定还有一种类型是非关系型的;非关系型数据库,又被称为NoSQL(Not Only SQL),意为不仅仅是SQL( Structured QueryLanguage,结构化查询语言);NoSQL的产生并不是要彻底地否定非关系型数据库,而是作为传统关系型数据库的一个有效补充。
  现在比较常见的NoSQL数据库:MongoDB、Cassandra、Memcached、Neo4J,而这些NoSQL数据库根据数据组织结构的不同也分为很多类别(比如:键值对、文本类、列模式、图数据库等等),这里就不做展开了,后面会有详细展开说明的专题文章。

关于三大范式

概念描述

  范式(数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。
  目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,关系型数据库只需满足第三范式(3NF)就行了。
  鉴于很多针对范式的理论性描述都非常冗长,这里就不罗列长篇大论了,而是通过自己的理解浓缩解释一下各个范式的特性;另外在网上看到一套还不错的示例图,所以这里也借用一些帮助理解,谢过分享图片的朋友。

第一范式(1NF)

特点浓缩: 保证数据的原子性(无重复的列)


  所谓的原子性,通俗的说就是每一个列(Column)都必须是不可分割的。
  基本上说,按照我们日常的思维,想做出不满足第一范式的数据结构设计也是很难的(比如:设计一个人员表,不会有人想着把姓名和性别合在一个字段里面吧?);所以这个范式是最基本的要求,每个字段都有自己独立存在的意义。

1
学号,姓名和性别,年龄 ...

第二范式(2NF)

特点浓缩: 保证数据的唯一性(属性完全依赖于主键)


  所谓唯一性,在第二范式中,基本的要求就是每个实例(也就是一行,Row)都必须可以被唯一的区分;每个表之描述一件事情。
  通常为了满足第二范式,我们会为表加上一个主键(一个具有唯一性的列,比如学生的学号),所有其他属性都只依赖表中的这个主键字段。
  比如下面这种结构就是不满足第二范式的,很明显这里学生信息和课程信息都交叉在一起了,这样课程成绩的依赖就变成了“学号+课程号”了,就失去了数据唯一性的特征。这种设计会导致业务操作出现一系列问题,比如对人员的操作直接影响课程数据之类的。

1
学号,姓名,课程号,课程名称,任课教师 ...

第三范式(3NF)

特点浓缩: 保证数据的依赖关系(属性不依赖于其它非主属性)


  这个概念理解起来稍稍有些迷茫,其实第二范式的那个例子也是可以用来解释第三范式这个规则的。理论上来讲课程信息本身(比如课程名,任课教师)是跟学生本身没有关系的,学生选择了课程才建立了关系,所以课程是不能依赖于学生的主属性的,也就是说,比较合理的结构是下面这样的:

1
2
3
学号,姓名 ...
课程号,课程名称,任课教师 ...
选课号,学号,课程号 ...

关于三大完整性

实体完整性

  指实体属性中的标识属性不能为空不能重复,约束由系统强制实施;简单说就是主键必须非空且唯一。

参照完整性

  参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。

用户自定义完整性

  设计数据库的时候用户定义了某一行不能为空或者其他规则(比如:性别只能选男或女,年龄不能大于150岁之类的)。

关于SQL

概念

  结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ “S-Q-L”),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
  结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

组成

DQL

  数据查询语言(DQL:Data Query Language):其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。

DML

  数据操作语言(DML:Data Manipulation Language):其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。

TPL

  事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。

DCL

  数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

DDL

  数据定义语言(DDL):其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。

CCL

  指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

数学支撑

  很多领域都是如此,在深入或者抽象之后都走到了数学这条路上,数学可以说是一切自然科学的基石,计算机领域更是如此,伟大的计算机人物基本都在数学领域也是颇有建树的,所以下面就说说数据库里面用到的基本数学理论知识。下面我们假设:

1
集合A={a,b,c},集合B={b,c,d}

  由所有属于集合A或属于集合B的元素所组成的集合,记作A∪B(或B∪A),即A∪B={x|x∈A,或x∈B};也就是说无论A和B哪个集合里有都算,按照上面的假设,这里A并B的结果就是:{a,b,c,d}。

  由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作A-B或A\B,即A-B={x|x∈A,且x∉B’};也就是说A里面有B里面没有的部分,按照上面的假设,这里A差B的结果就是:{a}。

投影

  关系R上的投影是从R中选择出若干属性列组成新的关系。记作:∏A(R) = { t[A] | t∈R };其中A为R中的属性列。

笛卡尔积

  笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员;符号表示为:A×B={(x,y)|x∈A∧y∈B}

选择

  选择又称为限制,它是在关系R中选择满足给定条件的诸元组,记作:σf(R)={t|t∈R∧F(t)=‘真’},其中F表示选择条件,它是一个逻辑表达式,取逻辑值‘真’或‘假’;

  由属于A且属于B的相同元素组成的集合,记作A∩B(或B∩A),即A∩B={x|x∈A,且x∈B};也就是说在A和B里面都存在的部分,按照上面的假设,这里A交B的结果就是:{b,c}。

连接

  关系R上的投影是从R中选择出若干属性列组成新的关系。记作:∏A(R) = { t[A] | t∈R };其中A为R中的属性列。

  设~是非空集合A的一个等价关系,若把以A关于~的全部等价类作为元素组成一个新的集合B,则把集合B叫做A关于~的商集合,简称为商集,记作B=A/~。

------2019 Lin.C ------