浅析数据完整性问题
2008-11-28 23:26
274 查看
浅析数据完整性问题
---- 在开发C/S结构的大型数据库应用软件时,一般情况下,软件开发人员和数据库设计人员并不是同一个人,这就需要协商好一些即可由程序设计人员解决又可由数据库设计人员来解决的问题,保证数据完整性就是一个这样的问题。
---- 笔者举一个最简单的例子:货物出库、退货的例子
---- 这里有库存表(kcb)、出库单表(ckb) 和退货单表(thb)
---- 库存表包含如下列:WPBH,KCSL〔物品编号,库存数量〕
---- 出库单表含如下列:WPBH,CKSL〔物品编号,出库数量〕
---- 退货单表含如下列:WPBH,THSL〔物品编号,退货数量〕
---- 假如我们进行了如下交易:
---- 1.物品A有十件出库
---- 2.物品A有五件退货(可再出库)
---- 我们都知道,这两笔交易都需要修改库存表,但修改库存表的工作由谁来做。可以肯定的说,程序设计人员和数据库设计人员都可以完成。
---- 首先我们举例由程序设计人员如何完成:
---- 1.出库时,产生新出库记录插入到出库单表中,同时将库存表中的KCSL用KCSL减掉出库数量的值取代。
---- 2.退货时,产生新退货记录插入到退货表中,同时将库存表中的KCSL用KCSL加上退货数量的值取代。
---- 由于不同的开发平台,完成这项工作的代码不尽相同,故不写出具体代码。
---- 接下来看看由数据库设计人员是如何完成这项工作:
---- 数据库设计人员完成这项工作靠的是触发器。
---- 数据库设计人员建立如下SQL语句为出库单表(ckb)建立插入触发器
CREATE TRIGGER FORINSERT
ON ckb
FOR INSERT
AS
UPDATE kcb
SET kcb.kcsl=kcb.kcsl - inserted.cksl
FROM inserted
WHERE kcb.wpbh=inserted.wpbh
---- 同样,也要为退货单表建立类似的SQL语句
CREATE TRIGGER FORINSERT
ON thb
FOR INSERT
AS
UPDATE kcb
SET kcb.kcsl=kcb.kcsl + inserted.thsl
FROM inserted
WHERE kcb.wpbh=inserted.wpbh
---- 可以很明显地看出,如果两个人都做了工作,程序在运行过程中一定会出错。
---- 但这项工作具体应该由谁来完成?我私下认为,应该由数据库设计人员来完成,原因如下:
---- 1、一个可移植性好的软件应该与数据的结构无关;
---- 2、程序的研制和调试更加简单,再拿上例来说,程序设计人员只需完成往出库单表和退货单表中插入相应的记录工作即可,具体修改工作由触发器来完成。
---- 3、触发器的运行是在服务器端,减轻了客户端的开销。
---- 4、触发器不管你在什么时候进行操作,它都会启动,保证数据不会出错。
---- 其实,上文所写的触发器只是一个最简单的例子,在实际工作中要远远比这复杂得多,设计一个好的数据库会花费数据库设计人员很大的心血,如果只是建立了表格,工作还没有完成一半呢,下一多半工作就是将你的数据完整性问题解决掉。
---- 成功地设计一个数据库能起到事半功倍的效果。数据的完整性已经解决了,程序设计起来还有什么问题呢?
---- 说来容易,做到却很难,比者在实际工作中也经常遇到很多问题,希望能和众多的同行共同进步,把你的经验和好的方法告诉大家。
---- 在开发C/S结构的大型数据库应用软件时,一般情况下,软件开发人员和数据库设计人员并不是同一个人,这就需要协商好一些即可由程序设计人员解决又可由数据库设计人员来解决的问题,保证数据完整性就是一个这样的问题。
---- 笔者举一个最简单的例子:货物出库、退货的例子
---- 这里有库存表(kcb)、出库单表(ckb) 和退货单表(thb)
---- 库存表包含如下列:WPBH,KCSL〔物品编号,库存数量〕
---- 出库单表含如下列:WPBH,CKSL〔物品编号,出库数量〕
---- 退货单表含如下列:WPBH,THSL〔物品编号,退货数量〕
---- 假如我们进行了如下交易:
---- 1.物品A有十件出库
---- 2.物品A有五件退货(可再出库)
---- 我们都知道,这两笔交易都需要修改库存表,但修改库存表的工作由谁来做。可以肯定的说,程序设计人员和数据库设计人员都可以完成。
---- 首先我们举例由程序设计人员如何完成:
---- 1.出库时,产生新出库记录插入到出库单表中,同时将库存表中的KCSL用KCSL减掉出库数量的值取代。
---- 2.退货时,产生新退货记录插入到退货表中,同时将库存表中的KCSL用KCSL加上退货数量的值取代。
---- 由于不同的开发平台,完成这项工作的代码不尽相同,故不写出具体代码。
---- 接下来看看由数据库设计人员是如何完成这项工作:
---- 数据库设计人员完成这项工作靠的是触发器。
---- 数据库设计人员建立如下SQL语句为出库单表(ckb)建立插入触发器
CREATE TRIGGER FORINSERT
ON ckb
FOR INSERT
AS
UPDATE kcb
SET kcb.kcsl=kcb.kcsl - inserted.cksl
FROM inserted
WHERE kcb.wpbh=inserted.wpbh
---- 同样,也要为退货单表建立类似的SQL语句
CREATE TRIGGER FORINSERT
ON thb
FOR INSERT
AS
UPDATE kcb
SET kcb.kcsl=kcb.kcsl + inserted.thsl
FROM inserted
WHERE kcb.wpbh=inserted.wpbh
---- 可以很明显地看出,如果两个人都做了工作,程序在运行过程中一定会出错。
---- 但这项工作具体应该由谁来完成?我私下认为,应该由数据库设计人员来完成,原因如下:
---- 1、一个可移植性好的软件应该与数据的结构无关;
---- 2、程序的研制和调试更加简单,再拿上例来说,程序设计人员只需完成往出库单表和退货单表中插入相应的记录工作即可,具体修改工作由触发器来完成。
---- 3、触发器的运行是在服务器端,减轻了客户端的开销。
---- 4、触发器不管你在什么时候进行操作,它都会启动,保证数据不会出错。
---- 其实,上文所写的触发器只是一个最简单的例子,在实际工作中要远远比这复杂得多,设计一个好的数据库会花费数据库设计人员很大的心血,如果只是建立了表格,工作还没有完成一半呢,下一多半工作就是将你的数据完整性问题解决掉。
---- 成功地设计一个数据库能起到事半功倍的效果。数据的完整性已经解决了,程序设计起来还有什么问题呢?
---- 说来容易,做到却很难,比者在实际工作中也经常遇到很多问题,希望能和众多的同行共同进步,把你的经验和好的方法告诉大家。
相关文章推荐
- InputFormat的数据划分、Split调度、数据读取三个问题的浅析
- InputFormat的数据划分、Split调度、数据读取三个问题的浅析
- 大数据相关问题浅析
- 酷友观点/经验:支付接口返回数据接收地址,session数据丢失(或者说失效)的问题浅析(原创文章)
- InputFormat的数据划分、Split调度、数据读取三个问题的浅析
- java-list-remove()用法浅析 解决java list remove() 数据不对的问题
- 浅析Bootstrip的select控件绑定数据的问题
- SpringMVC返回数据中文乱码问题浅析
- 浅析dom4j解析xml文件及其乱码问题以及与后台数据进行交互
- access 数据表a、b建立关系出现表b违反参照完整性原则问题解决办法。
- 浅析NTFS 文件系统数据流安全问题
- InputFormat的数据划分、Split调度、数据读取三个问题的浅析
- 修改user-agent爬取数据 遇到的问题
- 今天遇到一个问题:在程序中加入的定时触发器,当时出现这样一个问题,触发器定时2秒,程序从后台查询数据经过复杂处理后时间超过了2秒,我查阅好些网络上说有可能触发器等待程序执行完毕后,在触发下一次,也有说
- EXCEL中用数据透视表统计数据时,由于数据格式问题导致的统计不准确。
- JSON传输数据加号变空格问题
- java InputStream读取数据问题
- get_argument返回unicode数据类型的问题
- 并发问题,锁,怎么处理死锁,脏数据处理
- Struts 2 数据校验功能及校验问题的解决方案