关系数据库是采用关系模型作为数据组织方式的数据库。关系数据库的特点在于它将每个具有相同属性的数据独立地存储在一个表中。对任一表而言,用户可以新增、删除和修改表中的数据,而不会影响表中的其他数据。关系数据库的层次结构可以分为四级:数据库(Database)、表(Table)与视图、记录(Record)和字段(Field)。

 1.        关系数据库基本概念

实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,不如说“老师与学校的关系”。

属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。

元组:表中的一行就是一个元组。

分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。

码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码

全码:如果一个码包含了所有的属性,这个码就是全码。

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。可以减少数据库中数据冗余,增进数据的一致性。

外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

候选码: 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何真子集都不能再标识,则称该属性组为(超级码)候选码。

第一范式(1NF):属性不可分

对属性的原子性约束,要求属性具有原子性,不可再分解。不满足第一范式的数据库,不是关系数据库。

第二范式(2NF):非主属性完全依赖于码

2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性,更通俗说有主键ID

(学生,课程)是个码,课程却决定了教材,这就叫做不完全依赖,或者说部分依赖。出现这样的情况,就不满足第二范式,应该将表分为两个。

第三范式(3NF):消除传递依赖。

对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

BCNF:主属性不依赖于主属性

若关系模式属于第二范式,且每个属性都不传递依赖于键码,则R属于BC范式。

BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。

还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。

第四范式:删除同一表内的多对多关系。

第五范式:从最终结构重新建立原始结构。

一个数据库设计符合3NF或BCNF就可以了。

【其他数据库】

Mongodb

基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

Redis

key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型。

Hbase

开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为Java。是一个分布式的、面向列的开源数据库。

PostgreSQL

对象-关系型数据库