SQL——关系模型

来源:互联网 发布:淘宝八大山人书法全集 编辑:程序博客网 时间:2024/06/05 22:50

上一篇文章中介绍过数据库模型共有四种:关系模型,ER模型,基于对象的数据模型,半结构化模型。这四种模型中,最为常用和流行的就是关系模型,SQL语言所支持的数据库产品就基于关系模型。关系模型利用表的集合来表示数据和数据之间的关系

关系数据库的结构


关系数据库由表(table)的集合构成,每张表有自己唯一的名字,每张表有很多行和列。在关系模型中,定义了专业的术语来表示上述概念,用“关系”(relation)来指代表,而用“元组”(tuple)来指代行,用“属性”(attribute)来指代表中的列。类似地,采用了关系实例(relation instance)这个名词来表示一个关系的特定实例,也就是所包含的一组特定的行。当下面涉及到以上名词时,我们将采用“关系”,“元组”来做解释,而舍弃了容易让人混淆的”表”、”行”这些名词。

元组与属性是顺序无关的

由于关系是元组的集合,所以元组在关系中出现的顺序是无关紧要的。因此,无论关系中的元组是被按照某种情况被排列出先后的还是无序的都是没关系的。属性是表示关系中的元组取值的标识,属性在关系中颠倒位置,只会影响元组存放数值的先后,而不会改变实际的内容。所以,和元组相同,在关系中属性出现的顺序是无关紧要的。
在某些数据库中存放值时需要按照属性的顺序存放内容,这种方式更加便捷灵活,但实际上关系数据库并没有对属性的顺序做任何要求。

域是原子的

对于关系的每个属性,都存在一个允许的取值集合,称为该属性的”域“(domain)。换言之,域的作用类似于值域,限定了一个变量取值的范围。比如我们将age的域设置为0至150,薪水的域设置为>0,这是比较合理的做法。我们要求对所有关系R而言,R的所有属性的域都是原子的。如果域中元素被看作是不可再分的单元,则域是原子的
举个例子,比如一张User表中,一个元组的phone_number属性中存放了多组联系电话号码,那么这个域就不再是原子的,因为其中的元素是一组 电话号码,是可以被再分为单个电话号码这样的子成分。
当域中的值被确定时,它就能且仅能是一个确定值,而不能是多个值。比如0至100中的任意一个整数,当取出其中一个整数50时,我们认为这个域是原子的,值为50。但如果我们将{50,99}存放其中,想表示这个元组的该属性值可取50或99时便违反了域的原子性。

空值的特殊性

”空值“(null)是一个特殊的值,null可以用来表示为”未知,不存在“。在数据库中,一个boolean类型的判断属性除了true或false还可以取null值,表示我们不清楚它的真假性。这是一种三值判断的做法,让数据具有更多的灵活性。但是在数据库的操作中,空值会给查询和更新带来很多困难,因此应该尽量避免使用空值。

关系数据库的模式


当我们谈论数据库的时候,必须先区分数据库模式(database schema)数据库实例(database instance)前者是数据库的逻辑设计,后者是给定时刻中数据库的一个快照。

这样说起来可能有些难以理解,简单的说,schema(数据库模式)类似代表着数据库中一张表的表头栏,也就是所有属性的集合。而instance(数据库实例)表示着这个时刻这张表中的某一个元组,之所以强调时间是因为在每个时间点可能表中数据有变化。

码/键


因为表具有集合的特性,所以在一张表中每个元组都是独一无二的。我们使用每一个元组的一些属性来表示他们的不同。这也就是说,一个元组的属性必须是能唯一区分元组的

超码

超码是一个或多个属性的集合,这些属性的组合可以使我们在一个关系中唯一的标识一个元组。比如一个User的表中,我们可以使用ID_card(身份证号码)这个信息来标识这个元组。在整张表中不可能存在另一个元组与该元组ID_card属性数值相同的情况。超码不是唯一的,只要可以用来唯一的表示出这个元组的属性的集合都可以是该元组的一个超码

候选码

超码有很多,但我们并不对所有的超码都感兴趣。有的时候,我们只对其中最能表示出这个元组特性的属性集感兴趣。所以,我们用候选码这个名词来表示最小的超码

主码/主键

主码表示设计数据库的设计者选中的,用来在一个关系中区分不同元组的超码。主码并没有严格的规定,主码的选取很大程度上收到设计者思路的影响。

外码/外键

一个关系r1可能在它的属性中包含了另一个关系r2的主码。这个时候,在r1中这个r2主码的属性被称作外码。关系r1也称为外码依赖的参照关系,关系r2称为外码的被参照关系。

1 0
原创粉丝点击