序言
今天在根据新需求需要添加数据表时,自己根据业务需求以及自己所掌握的知识建立了一张自认为是属于从表的数据表,其实该表就是源数据库中的某一张的“副本”,只是添加了某些字段,其中有些字段与其他表的主键进行了外键关联。当我将该数据表的交给导师查看时,导师先是给我简略地介绍了扩展表和从表的含义,然后提示我说,这表的设计也可以算是从表,只是你有没有发现,他们之间有许多列的数据是重复的,是否可以删除呢?为什么呢?虽然当时自己回答可以,这样既可以节约表空间,也可以通过关联查询的方式获取到关联表中的数据,因此相同的数据列没有必要重复,但是事后自己觉得对于从表和扩展表仍需要做一些记录,以检验自己是否真正地理解了从表与扩展表的含义。因此,就有了这一篇博文,若读者发现本文有所讲的不对的或者您有不同的见解,欢迎留言或者直接Email笔者交流,邮箱:woodyoilovecn@gmail.com
从表
我们汉语中常常会提到主从之分,是否在数据表中存在主从之分呢?答案是肯定的。那么我们首先先来说明一下什么是主表。主表,其实就是在数据库中创建的数据表,只是它有个特征,那就是存在作为主表中作为唯一标识的主键,与其他表相关联。可能介绍到这里时,有读者已经能够猜到从表的含义了,没错,那就是以主表的主键作为外键,可以通过外键与主表进行关联查询的表。可能有的读者觉得文字说明还是不够形象,在这,笔者使用一个简单的例子再进行描述,希望能够描述的更形象、更具体一点。例子是这样的,
现有两张表,一张是记录学生信息的表,另一张是记录学生科目成绩信息的表。现在有一个需求是需要显示学生的信息以及其对应的科目成绩。(注:学生信息表与学生科目成绩表都有作为唯一标识的主键)
看到这个例子我们首先想到或者会是,学生信息表与学生科目信息表之间存在关联关系,这个关联关系在数据表中是如何体现的呢?其中一种体现方式可以是我们上面提到的主从表的形式,由于学生科目成绩存在上下学期之分,换句话说学生信息表是少的一方,学生科目成绩是多的一方,因为科目成绩是以学生为主导的,因而学生信息表是主表,而学生科目成绩表是从表,其关系下图:
介绍完主表和从表的含义后,关于主从表有一些规则我们还是需要注意的。
1.当需要插入数据到从表中时,主表中也需要有相应的主键信息,如不能忘学生记录表中插入学生信息表中不存在的学生的成绩记录
2.当需要修改主表的主键信息时,从表中对应的数据记录也需要随之变化。这个规则主要是避免由于主表中某一主键的变化,而从表中的记录没有作相应的改变,就可能会出现从表的数据记录无法与主表的数据记录关联的问题。
3.若需要删除主表的记录,若从表中存在相应的记录,则不能删除主表的记录,需要先删除从表中的记录,再删除主表。这主要是避免“死数据”的出现,如若将有成绩信息的学生删除,那其对应的成绩记录就会没有学生信息与之对应,从而成为“死数据”。
扩展表
介绍完主从表,扩展表相对来说就更简单了,简单来说扩展表是原有表属性的扩展,仍以原表主键作为扩展表的主键和唯一标识,如图所示。
这样说明,可能有读者会有这样的疑问了,为什么不直接在原有数据表中直接添加所需要扩展的属性呢?笔者是这样理解的,需要扩展表的属性时,通常是我们在设计数据表没有考虑到某些需求或者说是在开发过程中新增的需求,也就是原数据表可能已经被开发好的需求所使用到了,如果贸然修改,可能还需要对已开发好的业务代码进行相应的修改,这样大大增加了工作量,同时也有可能存在只有部分数据记录是需要扩展属性的,因此原数据表的主键为主键新设的扩展表,既可以避免影响已开发好的模块,同时也能更合理地利用表空间。