掃碼下載APP
及時(shí)接收最新考試資訊及
備考信息
安卓版本:8.7.50 蘋果版本:8.7.50
開發(fā)者:北京正保會(huì)計(jì)科技有限公司
應(yīng)用涉及權(quán)限:查看權(quán)限>
APP隱私政策:查看政策>
HD版本上線:點(diǎn)擊下載>
【摘 要】本文剖析了在編制和應(yīng)用財(cái)務(wù)軟件過程中數(shù)據(jù)表里出現(xiàn)冗余數(shù)據(jù)的原因及其引發(fā)的后果;在SQL Server 2000環(huán)境下,通過使用帶參數(shù)的存儲(chǔ)過程實(shí)現(xiàn)了對(duì)任意表中的冗余數(shù)據(jù)的刪除操作;提出了構(gòu)建隱含關(guān)鍵字避免數(shù)據(jù)冗余的方法,保證了實(shí)體完整性。
【關(guān)鍵詞】冗余數(shù)據(jù);SQL Server 2000;存儲(chǔ)過程;關(guān)鍵字
1 引 言
企業(yè)中對(duì)財(cái)務(wù)軟件的應(yīng)用是企業(yè)信息化水平的重要標(biāo)志,但在編制或應(yīng)用財(cái)務(wù)軟件的過程中,如對(duì)系統(tǒng)升級(jí)、數(shù)據(jù)表合并或跨年度數(shù)據(jù)整理時(shí),都經(jīng)常會(huì)產(chǎn)生重復(fù)數(shù)據(jù)的問題。而這部分冗余數(shù)據(jù),從數(shù)據(jù)庫設(shè)計(jì)角度看,不符合實(shí)體完整性規(guī)則;從財(cái)務(wù)管理的應(yīng)用角度看,會(huì)導(dǎo)致錯(cuò)誤的出現(xiàn)。
針對(duì)這種情況,在SQL Server 2000環(huán)境下,可以通過使用帶參數(shù)的存儲(chǔ)過程非常容易地實(shí)現(xiàn)對(duì)任意表中冗余記錄的處理,并且在數(shù)據(jù)表設(shè)計(jì)中采用構(gòu)建隱含關(guān)鍵字的方法避免冗余數(shù)據(jù)的產(chǎn)生。
2 冗余數(shù)據(jù)出現(xiàn)的原因及操作中的問題
2. 1冗余數(shù)據(jù)出現(xiàn)的原因分析
目前,財(cái)務(wù)軟件中廣泛使用的數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,其數(shù)據(jù)模型為關(guān)系模型。關(guān)系模型源于數(shù)學(xué),它把所有的信息(數(shù)據(jù))都存放在二維表中;每一個(gè)表又包含若干行與列,表被稱為關(guān)系。關(guān)系的嚴(yán)格定義如下:
域是一組具有相同數(shù)據(jù)類型的值的集合;給定一組域Dl,D2,…,Dn,則Dl,D2,…,Dn的笛卡兒積為:Dl ×D2 ×…×Dn={(d1,d2,…,dn)|di∈Dj , j=1,2, …,n} (其中每一個(gè)元素(d1,d2,…,dn)被稱為一個(gè)元組,元素中的每一個(gè)值di被稱為一個(gè)分量);那么,Dl × D2 ×…× Dn的子集被稱為在域Dl,D2,…,Dn上的關(guān)系,用R(Dl,D2,…,Dn)來表示。這里R表示關(guān)系的名字。
關(guān)系應(yīng)具有的一個(gè)重要性質(zhì)是關(guān)系中不允許重復(fù)的元組(即重復(fù)的記錄),在關(guān)系中,保證數(shù)據(jù)的正確性和一致性是通過關(guān)系模型的完整性規(guī)則來約束關(guān)系的。完整性規(guī)則包括3類:實(shí)體完整性、參照完整性和用戶定義的完整性。而實(shí)體完整性約束了在一個(gè)基本關(guān)系中各實(shí)體(即記錄)是可區(qū)分的,具有唯一的標(biāo)識(shí)。這是本文討論的重點(diǎn)。
實(shí)體完整性要求每個(gè)基本關(guān)系中有且僅有一個(gè)不能為空值的主碼(即關(guān)鍵字),每一個(gè)實(shí)體的主碼值必須唯一。
從關(guān)系數(shù)據(jù)庫的設(shè)計(jì)角度看,如果遵循實(shí)體完整性規(guī)則設(shè)計(jì)相應(yīng)的關(guān)系,那么在數(shù)據(jù)表中是不會(huì)出現(xiàn)冗余數(shù)據(jù)的。數(shù)據(jù)表中出現(xiàn)冗余數(shù)據(jù)無外乎兩種情況:
情況一:在數(shù)據(jù)表設(shè)計(jì)時(shí)并沒有按照實(shí)體完整性規(guī)則建立數(shù)據(jù)表
在這種情況下,建立數(shù)據(jù)表時(shí)并沒有為該表指定相應(yīng)的關(guān)鍵字,如果多次為該數(shù)據(jù)表添加相同的記錄后,就會(huì)出現(xiàn)冗余數(shù)據(jù)。
例:Create table jbbxx (kmbh char(10)qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))&建立數(shù)據(jù)表jbbxx
Insert into jbbxx values('10120101',30 000.56,
1 000.3,'07-03-02','01')&多次執(zhí)行記錄添加語句
情況二:在處理數(shù)據(jù)中,原表中的關(guān)鍵字約束的特性缺失
例:Create table jbbxx (kmbh char(12) not null primary key,qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))&建立帶有關(guān)鍵字的原表jbbxx
Select * into jbbxx_bak from jbbxx where left(kmbh,4)='1012'&由原表生成新表jbbxx_bak
查看原表(見圖1)和新表(見圖2)的數(shù)據(jù)表結(jié)構(gòu),發(fā)現(xiàn)在由原表生成新表的過程中,原表所定義的kmbh關(guān)鍵字約束在形成新表后缺失了。
2. 2操作冗余數(shù)據(jù)出現(xiàn)的問題
經(jīng)過上面的討論,可知數(shù)據(jù)表中是會(huì)出現(xiàn)冗余數(shù)據(jù)的,并且一旦出現(xiàn)冗余數(shù)據(jù),是無法通過交互方式進(jìn)行修改、刪除等操作的(見圖3)。
究其原因,是因?yàn)榻换顟B(tài)下針對(duì)的是一條記錄,而由于相同記錄的存在,使數(shù)據(jù)庫管理系統(tǒng)無法對(duì)當(dāng)前記錄進(jìn)行定位。
3 處理冗余數(shù)據(jù)的實(shí)現(xiàn)方法
3. 1實(shí)現(xiàn)思路
對(duì)數(shù)據(jù)表中的冗余數(shù)據(jù)的處理,可以采用游標(biāo)的方法遍歷數(shù)據(jù)表中記錄進(jìn)行解決,但這種方法有些煩瑣,本文介紹一種簡單高效的方法使該問題得到很好的解決。該方法的關(guān)鍵是運(yùn)用了SQL語言中Select查詢語句的Distinct關(guān)鍵字,該關(guān)鍵字的使用能夠在查詢結(jié)果集中除去重復(fù)的行(即冗余數(shù)據(jù)),根據(jù)此思路可以形成一個(gè)沒有冗余數(shù)據(jù)的結(jié)果表,步驟如下:
第一步:將有冗余數(shù)據(jù)存在的表中利用Distinct篩出不重復(fù)的記錄放置到新表中;
第二步:將原表中記錄刪除;
第三步:將新表中的記錄插入原表。
3. 2實(shí)現(xiàn)過程
本文用存儲(chǔ)過程實(shí)現(xiàn)處理過程,存儲(chǔ)過程是一組事先編譯好的Transact-SQL代碼,是一個(gè)獨(dú)立的數(shù)據(jù)庫對(duì)象,可以作為一個(gè)單元被用戶的應(yīng)用程序調(diào)用。
采用存儲(chǔ)過程具有的優(yōu)點(diǎn)是:(1)執(zhí)行速度快。由于存儲(chǔ)過程是已經(jīng)編譯好的代碼,所以執(zhí)行的時(shí)候不必再次進(jìn)行編譯,從而提高了程序的運(yùn)行效率。(2)模塊化編程。作為一個(gè)可重復(fù)使用的模塊化單元,存儲(chǔ)過程使得開發(fā)人員可以將復(fù)雜的功能封裝起來,提供給用戶簡單的調(diào)用接口,不僅減少開發(fā)人員的工作量,也降低了應(yīng)用的復(fù)雜度。
本文中,通過設(shè)計(jì)帶參數(shù)的存儲(chǔ)過程可以增強(qiáng)通用性,將數(shù)據(jù)表名設(shè)計(jì)為參數(shù),可實(shí)現(xiàn)對(duì)任意表的冗余數(shù)據(jù)處理;另外,在刪除記錄時(shí),因truncate語句比delete語句使用的系統(tǒng)和事務(wù)日志資源少,因此采用該語句提高效率。
Create procedure Clear_redundancy (@dbname nvarchar(25))
As
Declare @str nvarchar(255)
if Exists(select * from sysobjects where name=N'aa' And Xtype='U')
drop table aa
Set @str='select distinct * into aa from'+@dbname
EXEC sp_executesql @str &將無重復(fù)數(shù)據(jù)放入新表aa
Set @str=' truncate table '+@dbname
EXEC sp_executesql @str &采用truncate快速刪除記錄
Set @str='insert into'+@dbname+'select * fromaa'
EXEC sp_executesql @str&將aa中的記錄插回到原表
Return
4 避免冗余數(shù)據(jù)產(chǎn)生的方法
雖然采用本文提供的方法可以清除冗余數(shù)據(jù),但更有效的做法是避免冗余數(shù)據(jù)的出現(xiàn),從而從根本上解決因數(shù)據(jù)冗余造成的在操作記錄時(shí)的出錯(cuò)現(xiàn)象。
通過前面的分析,可以得知,數(shù)據(jù)冗余的產(chǎn)生或是由于設(shè)計(jì)數(shù)據(jù)表時(shí)未能通過關(guān)鍵字實(shí)現(xiàn)實(shí)體完整性的約束,或是指定了關(guān)鍵字,但在表的合并或相關(guān)操作中缺失了這一特性,因此,本文提出一種在設(shè)計(jì)表時(shí)定義隱含關(guān)鍵字方法,使這一問題很好地得到解決。
在SQL Server 2000中提供了在設(shè)計(jì)表時(shí),通過標(biāo)識(shí)列屬性identity可以為該列提供一個(gè)唯一的、遞增的值。該機(jī)制需要同時(shí)指定種子和增量,若不指定默認(rèn)值(1,1),則此值在進(jìn)行數(shù)據(jù)插入和修改時(shí)都無須用戶指定該值,而由數(shù)據(jù)庫系統(tǒng)管理和維護(hù)。因此,該列具有關(guān)鍵字的特性,即值唯一;而且在數(shù)據(jù)表的操作中又可保持列的identity屬性。
Create table jbbxx (key_code int identity(1,1),kmbh char(10),qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))
其中,表jbbxx中的key_code列被定義為標(biāo)識(shí)列,在添加記錄時(shí),其值單調(diào)增加,保持唯一性,從而保證了實(shí)體的完整性,因此,不會(huì)在操作(如修改、刪除)中出現(xiàn)錯(cuò)誤。
5 結(jié) 論
在實(shí)際工作中,數(shù)據(jù)冗余的存在會(huì)引起操作錯(cuò)誤的出現(xiàn),所以是每個(gè)數(shù)據(jù)庫管理員需要解決的問題。本文從問題的產(chǎn)生原因進(jìn)行分析,給出了一種簡單高效的解決方法,并通過定義隱含關(guān)鍵字方法避免了該問題的出現(xiàn),可以作為在實(shí)際數(shù)據(jù)庫維護(hù)工作中的有效方法。
主要參考文獻(xiàn):
?。?] 薩師煊,王珊. 數(shù)據(jù)庫系統(tǒng)概論[M]. 第3版. 北京:高等教育出版社,2000:45-55.
?。?] 許菱,秦曉海,孔令新. 巧用存儲(chǔ)過程進(jìn)行數(shù)據(jù)處理[J]. 中國管理信息化,2006,(7):62-64.
[3] 尹萍. SQL Server數(shù)據(jù)庫性能優(yōu)化[J]. 計(jì)算機(jī)應(yīng)用與軟件,2005,(3):51-53.
?。?] 王振輝,吳廣茂. SQL查詢語句優(yōu)化研究[J]. 計(jì)算機(jī)應(yīng)用, 2005,(12):207-208.
?。?] 金天榮. SQL Server的查詢優(yōu)化方法的設(shè)計(jì)和實(shí)現(xiàn)[J]. 微計(jì)算機(jī)信息,2006,(18):239-241.
上一篇:稽核軟件 檢測(cè)新會(huì)計(jì)準(zhǔn)則應(yīng)用情況的信息化...
下一篇:網(wǎng)絡(luò)時(shí)代會(huì)計(jì)信息生產(chǎn)模式的轉(zhuǎn)換:社會(huì)化與...
安卓版本:8.7.50 蘋果版本:8.7.50
開發(fā)者:北京正保會(huì)計(jì)科技有限公司
應(yīng)用涉及權(quán)限:查看權(quán)限>
APP隱私政策:查看政策>
HD版本上線:點(diǎn)擊下載>
官方公眾號(hào)
微信掃一掃
官方視頻號(hào)
微信掃一掃
官方抖音號(hào)
抖音掃一掃
Copyright © 2000 - 8riaszlp.cn All Rights Reserved. 北京正保會(huì)計(jì)科技有限公司 版權(quán)所有
京B2-20200959 京ICP備20012371號(hào)-7 出版物經(jīng)營許可證 京公網(wǎng)安備 11010802044457號(hào)