SQL——关系模型

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

关系数据库的结构


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

元组与属性是顺序无关的

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

域是原子的

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

空值的特殊性

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

关系数据库的模式


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

这样提及来可能有些难以理解,简单的说,schema(数据库模式)相似表明着数据库中一张表的表头栏,也就是全部属性的集合。而instance(数据库实例)表示着这个时刻这张表中的某一个元组,之因此强调时间是由于在每一个时间点可能表中数据有变化。对象

码/键


由于表具备集合的特性,因此在一张表中每一个元组都是独一无二的。咱们使用每个元组的一些属性来表示他们的不一样。这也就是说,一个元组的属性必须是能惟一区分元组的产品

超码

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

候选码

超码有不少,但咱们并不对全部的超码都感兴趣。有的时候,咱们只对其中最能表示出这个元组特性的属性集感兴趣。因此,咱们用候选码这个名词来表示最小的超码io

主码/主键

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

外码/外键

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