CP2_关系模型

来源:互联网 发布:中国最大的程序员网站 编辑:程序博客网 时间:2024/05/01 07:46

1  前奏

 

    关系模型直观说就是用表的形式来表现数据和数据间的联系。

    表就是关系,列式属性,行是记录。

    关系模型的成功很大一部分是因为关系代数的强大,它给关系模型提供了无比强大的理论支撑。

    数学上更喜欢用关系代替表,元组代替记录,这样可以引入元组变量以及许多数学机制对模型进行描述,所以要养成习惯,说关系和元组

 

    关于“模式”和“实例”的理解在CP1中已有描述,所以现在要说的“关系模式”和“关系实例”就直接正题:

    命名:关系模式首字母大写,关系实例全部小写

    格式:关系模式:Account_scheme(account_name,account_address...);关系实例account(Account_scheme)表示account是关系模式Account_scheme的一个实例。

 

    超码是一个或多个属性的集合,这个集合使我们在同一个关系中唯一标识一个元组。如果一个超码的任意真子集都不是超码,则称它为候选码,候选码可能有多个,经过挑选用于唯一标识元组的候选码叫做主码。

 

2  关系代数

 

    关系代数可以算是数据库查询语言的一种(针对表结构)。它与SQL等商用查询语言相比少了一些“语法修饰”,但却从根本上说明了从数据库中提取数据的基本技术。

    关系代数是过程化查询语言,而元组关系演算和域关系演算是非过程化的。关系代数以一个表或者两个关系为输入,输出是一个关系,用程序语言来说,它的返回值是操作数类型,并且是左值,因此可以用在任何需要左值的地方,也就是说可以嵌套在另一个关系代数表达式中。

    关系代数之至多是二元运算并不影响它表达查询的能力,但是貌似使查询的实现方式和效率受到了限制。不过我学的是关系代数,不是一个专门的针对特定数据库产品的查询语言,因此应当关注于它的表达能力,而不是具体实现上,对于查询的优化是基于某一特定产品来进行的,这里不涉及具体产品。

    也就是我们可以看到同一个查询需求,我们可以写出甚至截然不同的关系代数来完成,这时我们不需要比较两个查询的效率,因为这也是不可能的。

 

3  查询

 

    查询是数据库中使用最频繁的操作,也是数据库职业拉开层次的地方。

    现在不关心查询优化问题,只探讨如何将一个查询请求转化成简单查询语句。

 

    一个查询请求往往是一段话,如“找出住在Heshan并在银行中至少有三个账户的客户的总余额”。

    一个关系代数查询表达式由三个部分组成,一个操作符,表明何种操作;一个操作数列表,可以是一个关系或者两个,表明操作对象;还有一个谓词表达式,用来表达如何在操作数关系中查找相应元组———它们有什么特征。

 

    从一段中文转化到一个代数表达式,这是我们要做的。

 

    一个查询请求语句一般是没有主语的,没有谁会说:帮谁找,即使说了也没有查询语句能表达出这个意愿;而这句话一般是会有谓语的,要么是“找出”,要么是“增加”,要么是“删除”等等。这映射到关系代数上就是相应的操作符,但并不是一一对应的,因为根据句子的具体要求,以关系代数实现的时候可能会需要多个操作来完成,但这些操作中至少会有一个与该谓语对应,我称之为主操作符。因此,句子的谓语将直观的被转换成一个关系代数表达式的主操作符;谓语表明“要干嘛”,而宾语则指明“要什么”的操作结果,例句中的宾语是“客户的总余额”,宾语的映射也比较简单,它将直接映射成关系的特定属性,总余额就是sum(balance);最重要也是最复杂,同时也是最能让数据库工作者发挥创造力以拉开层次的地方就是句子的定语,它表明“什么样的东西”是宾语要满足的,是客户需求的直接体现,就像客户的需求总是茫茫多一样,定语也是茫茫长,首先总体上来说,定语映射成关系代数的谓词部分。

 

    不考虑查询效率的情况下,谓词的顺序是无关紧要的,定语如何映射也是无关紧要的。例句中的定语“住在Heshan并在银行中至少有三个账户”可以先符合前者或者后者,都没关系。关键的一点是,这一系列的定语怎么组织在关系代数中————实际的问题是,定语不是仅仅通过谓词就能完全表达的,因为有时候,这个定语必须分步实现。

 

    如何区分是否需要同步?定语分词1:“住在合山”,定语分词2:“至少有三个账户”,如果分词1的提到的属性与分词二提到的属性属于同一个关系,那么可以将他们合并成一个谓词——简单的用^连接即可。否则,有两种方式解决:1)构造一个表同时含有这些属性,归类到前一种情况去解决;2)分步,先用一个代数表达式完成分词1的需求,由于2中提到,关系代数的返回值是关系,且是左值,因此可以将它用作另一个关系代数表达式的操作数,在另一个表达式中完成分词2。

   

4  表的连接

 

    3中提到,当定语部分提到的属性不在同一个关系中(例如在两个关系中),可以构造一个同时包含这两个属性的关系来解决。所谓构造一个这样的表,最简单的方式就是将这两个表连接起来。

    关系代数中连接的方式很多,基本连接时笛卡尔积,附加的有自然连接,扩展的有外连接。

    

    笛卡尔积,关系A和关系B的笛卡尔积AXB是这样一个关系,它的关系模式E=A_Schema+B_Schema,这里用+号,表示即使A、B有相同的属性,甚至即使他们是同一个关系,相同的属性也不会合并而丢失;它的元组由两部分构成,其中一个来自A,另一个来自B。

 

    可以想象,如果A、B之间的属性没有重合(即相同),或者没有相关性,只是单纯的进行笛卡尔积,构造出来的表就没有任何检索意义,它只是无聊的信息叠加,产生的都是垃圾数据。

    笛卡尔积运算之后产生的关系,通过AB两个关系重合的属性可以筛选出那些在AB中都存在的元组。或者A,B没有重合属性,但是有相关属性,也就是在定语中提到的分别位于A,B的属性,那么在笛卡尔积运算后的关系上将定语以^连接谓词即可得到满足定语的元组了。

  

    对于有重合属性的情况,每当笛卡尔积运算后都要加上重合属性相等的谓词,如A.name=B.name来选出符合条件的元组,而自然连接简化了这一步骤。

    自然连接首先对两个关系进行笛卡尔积运算,然后对生成的关系在相同的属性上进行相等性选择。也就是说,如果两个关系没有相同属性,那么他们的自然连接就是笛卡尔积,而如果相同的关系进行自然连接,结果就是关系本身。

   

 

 

 

 

 

 

 

 

原创粉丝点击