餐饮管理系统中数据完整性的设计

更新时间:2024-03-01 作者:用户投稿原创标记本站原创 点赞:4877 浏览:14877

摘 要: 以餐饮管理系统数据库中部分表为例,详细介绍个人对数据完整性设计思路和设计方法,通过实例阐述数据完整性在实践中的应用,并给出基于SQLSERVERDE语言的描述.

关 键 词 : 数据库;数据完整性;约束;触发器

中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2011)1210173-01

数据库的创建是一件非常容易的事情,但是设计一个严谨、安全、可靠的数据库就不那么容易了,它需要你有扎实的理论知识做基础,还需要具备一定的分析问题解决问题的能力.数据库的设计经过需求分析、数据库概念机构设计、逻辑结构设计之后我们就应考虑数据完整性的设计了.数据完整性是最大限度的保证数据的正确性、可靠性、一致性.数据完整性包含三个方面的内容即实体完整性、参照完整性(引用完整性)和用户自定义完整性(域完整性).

下面以餐饮管理系统部分可以实现点菜和结账的表为例阐述以上完整性的设计.餐饮管理涉及的表的关系模式为:桌台表zt(桌号zh,桌名zm,容纳人数rnrs,状态zt,类型lx),菜单表cd(菜品编号cpbh,菜品名称cpmc,规格gg,类别lb,单价dj,成本价cbj),订单表dd(订单编号ddbh,订单日期ddrq,桌号zh,消费金额xfje),点菜表dc(订单编号ddbh,菜品编号cpbh,数量sl).以上四个表的定义如下:

Create table zt (zh char(4) primary key ,zm char(8) unique, rnrs int check (rnrs>等于0),zt bit,lx char(8) check (lx等于'大厅' or lx等于'包厢' lx等于'vip'))

Create table cd(cpbh char(5) primary key, cpmc char(12),gg char(10),lb char(8),dj numeric(6,1) check(dj>等于0),cbj numeric(6,1) check(cbj>等于0))

Create table dd (ddbh char(10) primary key,ddrq datetime,zh char(4) foreign key references zt(zh), xfje numeric(10,1))

Create table dc (ddbh char(10) foreign key references dd(ddbh),cpbh char(5) foreign key references cd(cpbh),sl int check(sl>等于0) default 1,primary key(ddbh,cpbh))

1.实体完整性(表完整性)

实体完整性又叫做表完整性,是对表中主键的约束.实体完整性的规则要求:在任何关系的任何一个元组中,主键的值不能为空值、也不能取重复的值.建立实体完整性的目的是用于保证数据库表中的每一个元组都是惟一的.是否可以改变主键值或删除一整行,取决于主键和其他表之间要求的完整性级别.实体完整性的定义比较简单.实现“实体完整性”的方法有primary key约束、unique约束、标识列、惟一索引.在此对桌台表zt中的桌号zh、菜单表cd表中的菜品编号cpbh以及订单表dd中的订单编号ddbh定义了primary key约束.在定义的时候一定要注意,一张完整的表定义只能有一个主键(PRIMARY KEY),但是可以没有UNIQUE约束.

2.参照完整性规则(引用完整性规则)

现实世界中的实体之间存在某种联系.在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在着关系与关系间的引用.通过在同一个数据库的两个表中进行主键约束和外键约束来实现,参照的列和被参照的列的必须具有相同的属性.

参照完整性规则规则要求:“不引用不存在的实体”.即:不允许在一个关系中引用另一个关系中不存在的元组.其目的用于确保相关联的表间的数据保持一致.参照完整性是对外键的约束,要求外键的取值只能为两种情况:若取非空值,则它必须是主表中存在的值.要么取空值(null).设置了参照完整性禁止在从表中插入包含主表中不存在的关键字的数据行;禁止删除在从表中的有对应记录的主表记录.

在如上四个表中对订单表dd的桌号zh、点菜表对此dc的订单编号ddbh及菜品编号cpbh分别设置了外键.另外外键的设计也可由触发器或编程语言来设定.以订单表dd为例触发器设置方法如下:

CREATE TRIGGER insert_xs ON dd

AFTER INSERT

AS

IF EXISTS

(SELECT * FROM INSERTED

WHERE zh IN (SELECT zh FROM zt))

PRINT '添加成功!’

ELSE

BEGIN

PRINT '桌号与存在的桌号不符!’

ROLLBACK TRANSACTION

END

同样可以对点菜表设置一个触发器要求dc的订单编号ddbh及菜品编号cpbh也具有参照性.参照完整性是用来维护相关数据表之间数据一致性的手段,通过实现引用完整性,可以避免因一个数据表的记录改变而使另一个数据表内的数据变成无效的值.

3.域完整性

域完整性也称为列完整性或用户定义的完整性,用于限制用户向列中输入的内容.域完整性规则要求由用户根据实际情况,定义表中属性的取值范围.其目的用于保证给定字段中数据的有效性,即保证数据的取值在有效的范围内.

设置域完整性的方法是限制列的数据类型、精度、范围、格式和长度等.可以通过指定数据类型、CHECK约束、DEFAULT约束、NOT NULL约束和创建规则、默认值等数据库对象来实施.

数据库中存储的数据多种多样,为每一列指定一个准确的数据类型是设计表的第一步,列的数据类型规定了列上允许的数据值.当添加或修改数据时,其类型必须要符合建表时所指定的数据类型.这种方式为数据库中的数据完整性提供了最基本的保障.

约束是SQL Server提供的自动保持数据完整性的一种方法,是独立于表结构的.规则是实现域完整性的方法之一,用来验证一个数据库中的数据是否处于一个指定的值域范围内,是否与特定的格式相匹配.当数据库中的数据值被更新或插入时,就要检查新值是否遵循规则.如果不符合规则就拒绝执行更新或插入操作.


在餐饮系统相关表中我们对相应的列设置了数据类型及长度度限制,并对菜单表cd的单价dj设置了check(dj>等于0)的约束,对点菜表dc的数量sl列(sl int check(sl>等于0) default 1)设置了check约束和默认值的约束.当然对于以上约束我们都可通过定义规则的方法实现.如:

用create rule dyl as@x>等于0来定义一个大于零的约束,然后用sp_bindrule dyl,'cd.dj‘语句和sp_bindrule dyl,'dc.sl'语句将其绑定到菜单表cd的单价dj列及点菜表dc的数量sl列上.

对于菜品编号cpbh我们规定菜类必须以类别的代表字母作为第一个字符,小分类的代表字母为第二个字符后面跟3位数字来表示.如CL001表示青菜类、LN001可表示奶类饮料.类别分类如表1:


表1 菜单类别表

为了实现上述编码我们用规则来实现如下:

Create rule cpbm as

@BM like 'C[LQRT][0-9][0-9][0-9]'

Or @BM like 'J[PBNM][0-9][0-9][0-9]'

Or @BM like 'Y[CNGT][0-9][0-9][0-9]'

Or @BM like 'z[fm][0-9][0-9][0-9]'

sp_bindrule cpbm, 'cd.cpbh'

4.触发器实现数据完整性

当用户对数据的完整性要求更为特殊,更为复杂,以上3种完整性就无法满足用户的要求.在这种情况下,用户需要自己定义所需的完整性.实现自定义完整性的重要方法是创建触发器.触发器是一种数据库对象.是一种表或视图执行insert、delete、update操作时,被系统自动执行的特殊的存储过程.创建触发器的目的是对表实现复杂的数据完整性约束,以防止不正确的操作.它与数据库中的某个表的数据修改操作相关联,修改操作可以是INSERT、UPDATE、和DELETE这3种操作中其中一种或几种.当用户对相关表执行触发器相关的修改操作时触发器自动执行.常用于数据的参照完整性限制及级联删除、级联更新等操作的设置.以级联更新为例,分析当菜单表中的菜品编号修改时,点菜表中的菜品编号同时更新这样的操作用触发器如何实现:

create trigger upd on cd after update

as

declare @jbh char(5),@xbh char(5)

select @jbh等于deleted.cpbh, @xbh等于 inserted.cpbh

from deleted,inserted where deleted.cpbh等于inserted.cpbh

print '准备级联更新点菜表中的菜品编号信息等.'

update dc set cpbh等于@xbh where cpbh等于@jbh

print '已经级联更新了点菜表原菜品编号为'+ @jbh +'的信息'

5.应用接口编程

应用接口编程对数据库应用设计来说是负担最重的方法,但同时又是最基本、最灵活的方法.不论数据库管理系统提供了多么丰富的完整性的约束手段,利用编程接口保证数据完整性仍是所有数据库应用设计者必须掌握的关键技术之一.

6.总结

保证数据库的数据完整性,在数据库管理系统中是十分重要的.合理地使用SQL Server为数据完整性提供的各项措施,对数据进行所需的约束限制,可以有效降低数据库在使用过程中可能出现的错误,提高数据库系统的可用性,减少处理数据错误所耗的费用.