也许你经常听到SQL server,Oracle,MySQL等名词,人们将它们统称为数据库。这些服务软件的完整名称其实叫做数据库管理系统(Database-Management System,DBMS),它由数据库(即一些数据的集合)与用来对数据库进行管理(比如访问、创建、删除、修改)的程序组成。
基于不同的数据模型,数据库又被分为很多种。目前最常见的,被广泛实现的是关系数据库,它基于关系模型。比如开头所说的三个DBMS中包含的均为关系数据库。
关系数据库是表的集合,下图即为MySQL(一款免费的关系数据库系统)中的一张表(命名为person)。通常把这一张表称作一个关系(relation),表中的每一列代表了一个属性(attribute),而每一行为表中的一条记录,又称为元组(tuple)。比如该表第一行的元组,是一个姓名为li ming的female,她的id为1。可以看出,li ming,female,1这三者的对应关系通过表连接了起来,这也是它被称作关系数据库的原因。
关系数据库是关系(或者说表)的集合,而关系则是元组的集合。比如在上图中,四个元组构成了这个关系。不过有以下几点要注意:1.既然关系是元组的集合,那么元组间其实是没有顺序的(因为集合没有顺序),当然你可以规定它展示在屏幕上时的顺序。2.集合中没有两个完全相同的元素,这意味着同一个表中没有两个完全相同的元组。
人们常常提到数据库模式(database schema) 和数据库实例(database instance) 这两个概念。数据库模式是指数据库的逻辑设计,是指使用DBMS支持的标准语言描述的数据库的结构;而数据库实例则是某一时刻数据库中数据的快照。关系数据库的模式又称关系模式,它由属性序列及其对应的域组成。比如在上图中的关系模式为person(name,sex,id)。
之前已经提到在同一个关系中没有两个完全相同的元组,那么是怎么样区分关系中不同元组的呢?其实是通过属性,如果一个属性不够就用多个属性。通常我们把能够区分关系中所有不同元组的一组属性的集合叫做超码(superkey);然而这组超码中可能有冗余的属性,即去掉这个属性也能区分所有的元组,如果把超码中所有的冗余属性去掉,就得到了候选码(candidate key),候选码是能够区分所有不同元组的最小属性集合。我们从候选码中选出来一个作为用来区分关系中不同元组的码,这个码称为主码(primary key)。这三种码都有区分不同元组的能力,我们真正选出来进行区分的是主码。
在这三种码之外,还有一种码叫做外码(foreign key),不过它是用来对属性值进行约束的。也许我们在一个表A中记录了所有学生正确的学号(且恰为主码),在表B中记录学生的学号和其它详细信息。很明显,在表B中出现的学号必须已经出现在表A中,否则它就是错误的学号。那么,我们定义B中的学号属性为A中的学号属性的外码,B也被称为外码依赖的参照关系(referencing relation),A为外码的被参照关系(referenced relation)。简单来说,B在它的属性中包含A的主码(假设为属性num),那么num在B上称为参照A的外码。