浅析数据完整性问题
发布时间:2007-10-07 12:44:00
在开发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、触发器不管你在什么时候进行操作,它都会启动,保证数据不会出错。
其实,上文所写的触发器只是一个最简单的例子,在实际工作中要远远比这复杂得多,设计一个好的数据库会花费数据库设计人员很大的心血,如果只是建立了表格,工作还没有完成一半呢,下一多半工作就是将你的数据完整性问题解决掉。
成功地设计一个数据库能起到事半功倍的效果。数据的完整性已经解决了,程序设计起来还有什么问题呢?
说来容易,做到却很难,比者在实际工作中也经常遇到很多问题,希望能和众多的同行共同进步,把你的经验和好的方法告诉大家。


猜你喜欢
- 本文实例讲述了Python实现截屏的函数。分享给大家供大家参考。具体如下:1.可指定保存目录.2.截屏图片名字以时间为文件名3.截屏图片存为
- 一个客户提供一个股价的信息,要求放在页面上,显示一些数据,需要从远程获取xml,然后解析写在网页上,开始不会觉得很难,其实蛮简单的,先用ja
- // 方法1 对象直接量var obj1 = { v1 : "", get_v1 : function() { &nbs
- <!doctype html><html><head><meta http-equiv
- 这篇文章主要介绍了python线程定时器Timer实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 总的来说,提高应用程序性能的最好的方法是发现应用的瓶径之所在,和数据库进行交互的性能无疑是决定应用程序性能的重要环节之一。因为ADO是当前最
- 本文实例讲述了django 框架实现的用户注册、登录、退出功能。分享给大家供大家参考,具体如下:1 用户注册:from django.con
- 用tornado web服务的基本流程1.实现处理请求的Handler,该类继承自tornado.web.RequestHandler,实现
- 本文实例讲述了Python3爬虫学习之应对网站反爬虫机制的方法。分享给大家供大家参考,具体如下:如何应对网站的反爬虫机制在访问某些网站的时候
- 1.文件的写入和读取#!/usr/bin/python # -*- coding: utf-8 -*- # Filename: using_
- permute(dims)将tensor的维度换位。参数:参数是一系列的整数,代表原来张量的维度。比如三维就有0,1,2这些dimensio
- 引言一般来说,很多时候我们面临这样一种情况,即我们需要运行时间记录器,它不断向我们显示当前时间或在给定的时间间隔内保持执行一定的代码和平,在
- 现像如下:站点无法打开,或者打开很慢.HTML可以打开.重新启动或者回收应用程序池可恢复.但过一段时间又会出现日志里会有:ISAPI
- 一、 模块1、模块的概念模块是 Python 程序架构的一个核心概念每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块模块
- 随着网页技术的发展,网络视觉设计与之前以程序员为主导的审美特征相比,具有了极大的改观。同时,随着美术、音乐、舞蹈人才的加入,网络开始在这一社
- 今天在论坛上面看到有些兄弟不知道HTC是什么东西。小生在这里稍微说一下。从5.5版本开始,Internet Explorer(IE)开始支持
- 简述生活中经常要用到各种要求的证件照电子版,红底,蓝底,白底等,大部分情况我们只有其中一种,所以通过技术手段进行合成,用ps处理证件照,由于
- 1.按需加载第三方库例如 ElementUI、lodash 等a, 装包npm install babel-plugin-component
- 前言大家应该都有所体会,在不同的项目可能会使用不同的Django版本,兼任性是大问题,如果不幸要去接手不同版本的项目,比较惨烈!如果想重装一
- 这篇文章主要介绍了python多进程并行代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以