數(shù)據(jù)庫完整性(data integrity)是信息安全的三個基本要點之一,指數(shù)據(jù)在傳輸、交換、存儲和處理過程中,確保數(shù)據(jù)值始終處于正確的狀態(tài)。數(shù)據(jù)庫完整性包括數(shù)據(jù)的正確性、有效性和一致性。
數(shù)據(jù)庫完整性要求維護和保證數(shù)據(jù)準確、一致和有效,對用于存儲、處理或者檢索數(shù)據(jù)的任何系統(tǒng)的設計、使用都具有重要意義,關系到數(shù)據(jù)是否能夠真實反映現(xiàn)實世界。隨著數(shù)據(jù)量繼續(xù)呈指數(shù)增長,依賴數(shù)據(jù)集成和準確解釋信息進行行為預測、市場評估等需求快速增長,數(shù)據(jù)庫完整性對數(shù)據(jù)挖掘至關重要,重要性也在增加。
數(shù)據(jù)庫完整性分為物理完整性和邏輯完整性。通常,數(shù)據(jù)庫完整性通過一系列完整性約束或規(guī)則在數(shù)據(jù)庫系統(tǒng)中強制執(zhí)行。完整性約束主要有實體完整性約束、參照完整性約束、函數(shù)依賴約束和統(tǒng)計約束四類。實體完整性約束指依賴于主鍵(標識數(shù)據(jù)片段的唯一值)確保數(shù)據(jù)唯一性和無空值。參照完整性約束指將外鍵使用規(guī)則嵌入到數(shù)據(jù)庫結(jié)構(gòu)中,使得僅發(fā)生適當?shù)臄?shù)據(jù)更改、添加或刪除,消除重復數(shù)據(jù)輸入,保證數(shù)據(jù)輸入準確和不允許輸入不適用數(shù)據(jù)的約束,確保數(shù)據(jù)被統(tǒng)一存儲和使用。函數(shù)依賴約束指同一關系中不同屬性之間應該滿足的約束條件。統(tǒng)計約束規(guī)定某個屬性值與一個關系中多個元祖統(tǒng)計值之間要滿足的約束。通常使用數(shù)字簽名、散列函數(shù)等手段來保證數(shù)據(jù)庫完整性。
原理介紹
數(shù)據(jù)庫完整性對于數(shù)據(jù)庫應用系統(tǒng)非常關鍵,其作用主要體現(xiàn)在以下幾個方面:
1.數(shù)據(jù)庫完整性約束能夠防止合法用戶使用數(shù)據(jù)庫時向數(shù)據(jù)庫中添加不合語義的數(shù)據(jù)。
2.利用基于DBMS的完整性控制機制來實現(xiàn)業(yè)務規(guī)則,易于定義,容易理解,而且可以降低應用程序的復雜性,提高應用程序的運行效率。同時,基于DBMS的完整性控制機制是集中管理的,因此比應用程序更容易實現(xiàn)數(shù)據(jù)庫的完整性。
3.合理的數(shù)據(jù)庫完整性設計,能夠同時兼顧數(shù)據(jù)庫的完整性和系統(tǒng)的效能。比如裝載大量數(shù)據(jù)時,只要在裝載之前臨時使基于DBMS的數(shù)據(jù)庫完整性約束失效,此后再使其生效,就能保證既不影響數(shù)據(jù)裝載的效率又能保證數(shù)據(jù)庫的完整性。
4.在應用軟件的功能測試中,完善的數(shù)據(jù)庫完整性有助于盡早發(fā)現(xiàn)應用軟件的錯誤。
數(shù)據(jù)庫完整性約束可分為6類:列級靜態(tài)約束、元組級靜態(tài)約束、關系級靜態(tài)約束、列級動態(tài)約束、元組級動態(tài)約束、關系級動態(tài)約束。動態(tài)約束通常由應用軟件來實現(xiàn)。不同DBMS支持的數(shù)據(jù)庫完整性基本相同。
關系模型
關系完整性的用于保證數(shù)據(jù)庫中數(shù)據(jù)的正確性。系統(tǒng)在進行更新、插入或刪除等操作時都要檢查數(shù)據(jù)的完整性,核實其約束條件,即關系模型的完整性規(guī)則。在關系模型中有四類完整性約束:實體完整性、域完整性、參照完整性和用戶定義的完整性,其中實體完整性和參照完整性約束條件,稱為關系的兩個不變性。
實體
關系數(shù)據(jù)庫的完整性規(guī)則是數(shù)據(jù)庫設計的重要內(nèi)容。絕大部分關系型數(shù)據(jù)庫管理系統(tǒng)時態(tài)數(shù)據(jù)庫都可自動支持關系完整性規(guī)則,只要用戶在定義(建立)表的結(jié)構(gòu)時,注意選定主鍵、外鍵及其參照表,RDBMS可自動實現(xiàn)其完整性約束條件。
(1)實體完整性(Entity Integrity)。實體完整性指表中行的完整性。主要用于保證操作的數(shù)據(jù)(記錄)非空、唯一且不重復。即實體完整性要求每個關系(表)有且僅有一個主鍵,每一個主鍵值必須唯一,而且不允許為“空”(NULL)或重復。
(2)實體完整性規(guī)則要求。若屬性A是基本關系R的主屬性,則屬性A不能取空值,即主屬性不可為空值。其中的空值(NULL)不是0,也不是空隔或空字符串,而是沒有值。實際上,空值是指暫時“沒有存放的值”、“不知道”或“無意義”的值。由于主鍵是實體數(shù)據(jù)(記錄)的惟一標識,若主屬性取空值,關系中就會存在不可標識(區(qū)分)的實體數(shù)據(jù)(記錄),這與實體的定義矛盾,而對于非主屬性可以取空值(NULL),因此,將此規(guī)則稱為實體完整性規(guī)則。如學籍關系(表)中主屬性“學號”(列)中不能有空值,否則無法操作調(diào)用學籍表中的數(shù)據(jù)(記錄)。
域完整性
域完整性(Domain Integrity)是指數(shù)據(jù)庫表中的列必須滿足某種特定的數(shù)據(jù)類型或約束。其中約束又包括取值范圍、精度等規(guī)定。表中的CHECK、FOREIGN KEY約束和DEFAULT、 NOT NULL定義都屬于域完整性的范疇。
參照完整性
參照完整性(Referential Integrity)屬于表間規(guī)則。對于永久關系的相關表,在更新、插入或刪除記錄時,如果只改其一,就會影響數(shù)據(jù)的完整性。如刪除父表的某記錄后,子表的相應記錄未刪除,致使這些記錄稱為孤立記錄。對于更新、插入或刪除表間數(shù)據(jù)的完整性,統(tǒng)稱為參照完整性。通常,在客觀現(xiàn)實中的實體之間存在一定聯(lián)系,在關系模型中實體及實體間的聯(lián)系都是以關系進行描述,因此,操作時就可能存在著關系與關系間的關聯(lián)和引用。
在關系數(shù)據(jù)庫中,關系之間的聯(lián)系是通過公共屬性實現(xiàn)的。這個公共屬性經(jīng)常是一個表的主鍵,同時是另一個表的外鍵。參照完整性體現(xiàn)在兩個方面:實現(xiàn)了表與表之間的聯(lián)系,外鍵的取值必須是另一個表的主鍵的有效值,或是“空”值。
參照完整性規(guī)則(Referential Integrity)要求:若屬性組F是關系模式R1的主鍵,同時F也是關系模式R2的外鍵,則在R2的關系中,F(xiàn)的取值只允許兩種可能:空值或等于R1關系中某個主鍵值。
R1稱為“被參照關系”模式,R2稱為“參照關系”模式。
注意:在實際應用中,外鍵不一定與對應的主鍵同名。外鍵常用下劃曲線標出。
用戶定義完整性
用戶定義完整性(User-defined Integrity)是對數(shù)據(jù)表中字段屬性的約束,用戶定義完整性規(guī)則(User-defined integrity)也稱域完整性規(guī)則。包括字段的值域、字段的類型和字段的有效規(guī)則(如小數(shù)位數(shù))等約束,是由確定關系結(jié)構(gòu)時所定義的字段的屬性決定的。如,百分制成績的取值范圍在0~100之間等。
設計階段
一個好的數(shù)據(jù)庫完整性設計首先需要在需求分析階段確定要通過數(shù)據(jù)庫完整性約束實現(xiàn)的業(yè)務規(guī)則,然后在充分了解特定DBMS提供的完整性控制機制的基礎上,依據(jù)整個系統(tǒng)的體系結(jié)構(gòu)和性能要求,遵照數(shù)據(jù)庫設計方法和應用軟件設計方法,合理選擇每個業(yè)務規(guī)則的實現(xiàn)方式;最后,認真測試,排除隱含的約束沖突和性能問題。基于DBMS的數(shù)據(jù)庫完整性設計大體分為以下幾個階段:
需求分析
經(jīng)過系統(tǒng)分析員、數(shù)據(jù)庫分析員、用戶的共同努力,確定系統(tǒng)模型中應該包含的對象,如人事及工資管理系統(tǒng)中的部門、員工、經(jīng)理等,以及各種業(yè)務規(guī)則。
在完成尋找業(yè)務規(guī)則的工作之后,確定要作為數(shù)據(jù)庫完整性的業(yè)務規(guī)則,并對業(yè)務規(guī)則進行分類。其中作為數(shù)據(jù)庫模式一部分的完整性設計按下面的過程進行。而由應用軟件來實現(xiàn)的數(shù)據(jù)庫完整性設計將按照軟件工程的方法進行。
概念設計
概念結(jié)構(gòu)設計階段是將依據(jù)需求分析的結(jié)果轉(zhuǎn)換成一個獨立于具體DBMS的概念模型,即實體關系圖(ERD)。在概念結(jié)構(gòu)設計階段就要開始數(shù)據(jù)庫完整性設計的實質(zhì)階段,因為此階段的實體關系將在邏輯結(jié)構(gòu)設計階段轉(zhuǎn)化為實體完整性約束和參照完整性約束,到邏輯結(jié)構(gòu)設計階段將完成設計的主要工作。
邏輯設計
此階段就是將概念結(jié)構(gòu)轉(zhuǎn)換為某個DBMS所支持的數(shù)據(jù)模型,并對其進行優(yōu)化,包括對關系模型的規(guī)范化。此時,依據(jù)DBMS提供的完整性約束機制,對尚未加入邏輯結(jié)構(gòu)中的完整性約束列表,逐條選擇合適的方式加以實現(xiàn)。
在邏輯結(jié)構(gòu)設計階段結(jié)束時,作為數(shù)據(jù)庫模式一部分的完整性設計也就基本完成了。每種業(yè)務規(guī)則都可能有好幾種實現(xiàn)方式,應該選擇對數(shù)據(jù)庫性能影響最小的一種,有時需通過實際測試來決定。
設計原則
在實施數(shù)據(jù)庫完整性設計的時候,有一些基本的原則需要把握:
1.根據(jù)數(shù)據(jù)庫完整性約束的類型確定其實現(xiàn)的系統(tǒng)層次和方式,并提前考慮對系統(tǒng)性能的影響。一般情況下,靜態(tài)約束應盡量包含在數(shù)據(jù)庫模式中,而動態(tài)約束由應用程序?qū)崿F(xiàn)。
2.實體完整性約束、參照完整性約束是關系數(shù)據(jù)庫最重要的完整性約束,在不影響系統(tǒng)關鍵性能的前提下需盡量應用。用一定的時間和空間來換取系統(tǒng)的易用性是值得的。
3.另一方面,觸發(fā)器的多級觸發(fā)不好控制,容易發(fā)生錯誤,非用不可時,最好使用Before型語句級觸發(fā)器。
4.在需求分析階段就必須制定完整性約束的命名規(guī)范,盡量使用有意義的英文單詞、縮寫詞、表名、列名及下劃線等組合,使其易于識別和記憶,如:CKC_EMP_REAL_INCOME_EMPLOYEE、PK_EMPLOYEE、CKT_EMPLOYEE。如果使用CASE工具,一般有缺省的規(guī)則,可在此基礎上修改使用。
5.要根據(jù)業(yè)務規(guī)則對數(shù)據(jù)庫完整性進行細致的測試,以盡早排除隱含的完整性約束間的沖突和對性能的影響。
6.要有專職的數(shù)據(jù)庫設計小組,自始至終負責數(shù)據(jù)庫的分析、設計、測試、實施及早期維護。數(shù)據(jù)庫設計人員不僅負責基于DBMS的數(shù)據(jù)庫完整性約束的設計實現(xiàn),還要負責對應用軟件實現(xiàn)的數(shù)據(jù)庫完整性約束進行審核。
7.應采用合適的CASE工具來降低數(shù)據(jù)庫設計各階段的工作量。好的CASE工具能夠支持整個數(shù)據(jù)庫的生命周期,這將使數(shù)據(jù)庫設計人員的工作效率得到很大提高,同時也容易與用戶溝通。
參考資料 >
[科普中國]-數(shù)據(jù)安全.科普中國網(wǎng).2024-03-17
數(shù)據(jù)完整性.中國大百科全書.2024-03-17
Why is data integrity important?.fortinet.2024-03-17