APP下载

SQL Server数据库中关于数据完整性的教学案例探析

2018-11-16向瑜

求知导刊 2018年27期
关键词:字段触发器完整性

向瑜

一 、概述

在关系型数据库系统中,数据完整性约束、数据结构和数据操作是组成其数据模型的三个基本要素。其中的数据完整性约束是一组完整性规则的集合,它规定数据库状态及状态变化所应满足的条件,以保证数据的正确性、有效性和相容性。完整性规则是给定的数据模型中数据及其联系所具有的制约和存储规则,用以限定符合数据模型的数据库状态及状态的变化,以保证当授权用户对数据库进行修改时保证数据的正确、有效和相容,不会破坏数据的一致性,防止对数据的意外损坏。

在数据库课程中,完整性约束的设计与实现是教学中非常重要的一部分,在教学中要让学生充分理解并掌握完整性约束的重要性和实现方法。为了帮助学生理解和掌握,本文通过一个他们较熟悉的选课系统来介绍基于SQL Server的数据完整性案例。

二、数据库完整性案例

在学生选课系统中,一个学校有多名学生,每个学生有唯一的学号;学校的课程有若干门,每一门课程均有各自的课程编号,有些课程如“计算机应用基础”选修的人较多,相同的课程成绩有多个,它们具有相同的课程编号,数据库要记录相同编号的课程有多少个选修成绩,未被选修的课程有哪些;每个选修的信息和未选修的信息均要记录在数据库中。

根据以上语义,進行相应的概念模型设计,得到如图1所示的系统E-R图,从图中可以看出,系统有两个实体:学生和课程,由于一个学生可以选修多门课程,一门课程也可以被多个学生选修,因此两个实体间的关系是多对多(m:n)。E-R模型主要是面向用户的,需要将其转换为具体数据库管理系统支持的数据模型。将这个概念模型转换为关系数据库模型时,可转换为如下的3个表:学生实体对应student表,课程实体对应course表,表示学生实体和课程实体多对多关系的score表。三个表的结构如表1~表3所示。

1.实体完整性

一个实体在数据库中表现为表中的一条记录,实体完整性保证表中每条记录必须是唯一的,可通过主键或唯一码、唯一索引和标识列等方式来实现。

在student表和course表中,可分别采用studentno和courseno作主键,保证了记录的唯一与实体的完整性。在score表中,由于一个学生可以选修多门课程,一门课程可以被多个学生同时选修,因此studentno和courseno分别作主键都不合适,此时在score表中可以将studentno和courseno两个字段作复合主键。在数据库设计中,当复合主键的元素大于等于3时,通常还可增加一个没有实际意义的编号字段作为主键,该字段无其他含义,只是用来标注记录的唯一性。在教学过程中,可以通过设置score表的主键来讲解复合主键的概念,强调复合主键不是指有多个主键,而是指将多个字段组成一个整体来共同构成主键,标识记录的唯一性。

2.参照完整性

参照完整性又称引用完整性,是指两个表的主键与外键之间定义的数据完整性,表明了两个表之间的关系。参照完整性可以保证两个引用表间数据的一致性,可以通过外键、检查、触发器和存储过程等方式实现。

在score表中的studentno要求必须是student表中已经存在的studentno,因此score表中的studentno字段作为外键,引用了student表的studentno字段值。同理score表中的courseno也是外键,引用了course表的courseno字段值。

在教学过程中,为了让学生更好地体会并掌握外键的概念,可采取以下办法:

(1)在score表中添加一条记录,该记录中的studentno值在student表中不存在。将返回错误信息。测试结果:记录将无法添加到score表中。

(2)同理如果删除student表中的一个学生信息,该学生在score表中有成绩信息。

测试结果:无法删除。原因是如果删除了,score表中对应的记录就将失去意义,无法确定这条信息是那个学生的成绩信息,因为该学生的信息已经在student表中删除。

设定参照完整性之后,student表、course表和score表之间的关系如图2所示:

从图中可见:student表和score表, course表和score表都是一对多的关系。

3.域完整性

域就是指表中的列,域完整性要求列的数值具有正确的类型、格式和有效值范围,并确定是否允许有空值。通常使用有效性检查强制域完整性,也可以通过限定列中允许的数据类型、格式或有效值范围来强制数据完整性。默认值、检查、外键、数据类型和规则也可用来实现域完整性。

如在student表中,email表示学生的邮箱地址,输入数据时应当包含一个“@”符号,如果不满足此要求,则会判断其是不合法的数据,并禁止输入。此时需在student表中添加一条check约束,“email like ‘%@%”。

4.用户自定义完整性

用户还可以根据其应用环境的不同,对数据库设置一些特殊的约束条件(自定义完整性),反映某一具体应用所涉及的数据必须满足的语句要求。用户自定义完整性涵盖的内容比较多,例如:字段的数据类型、字段的约束、触发器,等等。

(1)字段的数据类型。在course表中,period字段表示课程的学时数,数据类型为tinyint,credit字段则表示该门课所占的学分,数据类型为numeric,限定了数据类型就可以确保对应的字段值只能是数值类型的数据,避免由于操作错误输入一些非数字字符。score表中的usually和final字段,数据类型都是numeric,不仅避免了非数字型数据的存储,另外针对两个数值型字段,还可以利用表达式进行简单计算,如令二者各占一定百分值,求出综合成绩。

在教学中,要给学生强调选择数据类型的重要性,不能将所有字段的数据类型都定义为char类型,应该根据语义为字段选择合适的数据类型,SQL Server有许多内置的函数可以用于不同数据类型的数据上。

(2)字段的约束。字段的约束是为了保证语义的正确性,定义关于列中允许值的规则,是强制实施完整性的标准机制。如本例中的usually和final项,数值均要求为0~100,即score表中应该添加两条check约束,“usually>=0 and usually<=100”和“final between 0 and 100”。另外在本例中,student表中的sex字段的取值只能是“男”或“女”,也应该添加对应的check约束:“sex in(‘男‘女)”。

在教學中要特别强调数据库设计中字段约束的重要性,这是对其语义的保障,这一工作最好能在数据库设计时就完成,将会极大程度地减少工作量且更符合规范化设计的流程。

(3)触发器。触发器是一种响应数据操作或数据定义语言事件而执行的特殊类型的存储过程,是在用户对某一表中的数据进行更新、插入和删除操作时被触发执行的一段程序。触发器功能强大,能够为数据完整性和系统的总体操作增加极大的灵活性。触发器在功能上类似于CHECK约束,但是使用更灵活,可以跨表、数据库或触发器工作。通常用触发器来满足业务逻辑,实现数据库的参照完整性。

触发器是教学过程中的一个难点,在教学中要注意两点:第一,要强调触发器的作用和执行过程,触发器常用来实现自定义完整性,触发器的执行不是用户直接调用,而是在对某个表执行特定的操作,如增加删除修改后自动的触发。可以通过以上案例分析触发器是如何实现特定的业务逻辑。第二,在编写触发器中,通常会用到系统的两个临时表deleted和inserted,如在本例triUpdatescore触发器中,修改前记录信息放在deleted表中,修改后的记录则放在了inserted表中。

三、结论

本文通过一个完整的案例介绍了数据库课程中的数据完整性实现的过程。在实际教学中,教师也可通过理论讲解、案例分析、设计和实现等多个环节相结合的方式来让学生来理解数据库完整性的作用和实现方法,为学生今后从事相关数据库开发工作奠定一定的基础。

参考文献:

[1]姜桂洪.SQL Server 2008数据库应用与开发[M].北京:清华大学出版社,2015.

[2](美)Abraham Silberschatz ,(美)Henry F.Korth,(美)S.Sudarshan.数据库系统概念(原书第6版)[M].杨冬青,李红燕,唐世渭,译.机械工业出版社,2012.

[3]何玉洁,刘福刚.数据库原理及应用[M].北京:人民邮电出版社,2012.

[4]韩 雪.教学管理系统的研究与设计[D].长春:吉林大学,2008.

[5]陈永强,张志强.SQL Server 2005 Web应用开发[M].北京:清华大学出版社,2008.

[6]金玉明.PB与SQL Server的连接技术与实现[J].电脑知识与技术,2007(24).

[7]闫 旭.浅谈SQL Server数据库的特点和基本功能[J].价值工程,2012(22):229-231.

猜你喜欢

字段触发器完整性
酶可提高家禽的胃肠道完整性和生产性能
带钩或不带钩选择方框批量自动换
防止调度自动化系统漏监视告警的一些措施
配置触发器有条件启动Windows服务
基于Multisim14.0的双D触发器应用与仿真
触发器在酒店管理系统中的应用
探讨CNMARC格式中200字段题名的规范著录
无正题名文献著录方法评述
基于电路原理的触发器波形分析
谈书法作品的完整性与用字的准确性