KIỂM SOÁT DỮ LIỆU NGỮ NGHĨA
6.3.1. Kiểm soát toàn vẹn ngữ nghĩa tập trung
Một hệ thống nhỏ kiểm soát ngữ nghĩa có hai thành phần chính: Một ngôn ngữ để diễn tả và thao tác các phán đoán toàn vẹn, và một định chế chịu trách nhiệm thực hiện các hành động cụ thể nhằm cưỡng chế tính toàn vẹn khi có cập nhật đặc tả các ràng buộc toàn vẹn.
Ràng buộc toàn vẹ phải do người quản trị CSDL thiết lập trên cơ sở của một ngôn ngữ bậc cao, ví dụ dùng SQL của ANSI (American National Standard Istitule). Chúng ta cần phân biệt ba loại ràng buộc toàn vẹn là: ràng buộc tiền định, ràng buộc tiền biên dịch và ràng buộc tổng quát.
Để minh hoạ, bằng ví dụ, cho ba loại ràng buộc này, chúng ta xét CSDL sau: EMP (ENO, ENAME, TITLE)
PROJ(PNO, PNAME, BUDGET) ASG(ENO, PNO, RESP, DUR)
Ràng buộc tiền định (Predefined constraint) dựa trên các từ khoá đơn giản nhờ đó có thể diển tả chính xác các ràng buộc thông dụng trong mô hình quan hệ như thuộc tính không null, khoá duy nhất, khoá ngoài hoặc phụ thuộc hàm. Các ví dụ sau đây minh hoạ cho ràng buộc tiền định:
Ví dụ 6.3.1- 1: Thuộc tính không nhận giá trị null ENO NOT NULL IN EMP
Thuộc tính mã số nhân viên ENO trong quan hệ EMP không được nhận giá trị null. Ví dụ 6.3.1-2 Giá trị khoá phải duy nhất
(ENO, PNO) UNIQUE IN ASG
giá trị khoá (ENO, PNO) phải là duy nhất trong quan hệ ASG Ví dụ 6.3.1-3 Khoá ngoại
PNO IN ASG REFERENCES PNO IN PROJ
Khoá, mã số PNO trong quan hệ ASG là khoá ngoại tương ứng với khoá chính
PNO trong quan hệ PROJ. Nói cách khác, một dự án được tham chiếu trong quan hệ ASG phải tồn tại trong quan hệ PROJ.
Ví dụ 6.3.1-4 phụ thuộc hàm
ENO IN EMP DETERMINES ENAME
Ràng buộc tiền biên dịch (Precompiled constraint) xác định và diễn tả các điều kiện phải được thoả mãn bởi tất cả các bộ trong quan hệ đối với một kiểu cập nhật (INSERT, DELETE, hoặc MODIFILE) đã cho. Để xác định các bộ cần cập nhật trong định nghĩa ràng buộc, chúng ta đưa ra hai biểu NEW và OLD tương ứng với bộ mới - được chèn vào, hay bộ cũ - được sửa chữa hoặc xoá đi. Ràng buộc tiền định, có thể dùng với lệnh CHECK của SQL được bổ sung thêm khả năng đặc tả kiểu cập nhật. Cú pháp của câu lệnh dùng lệnh CHECK là:
CHECK ON <Tên quan hệ> WHEN <Kiểu cập nhật> (<lượng từ hoá quan hệ>)
Các ví dụ về ràng buộc tiền biên dịch: Ví dụ 6.3.1-5: Ràng buộc miền
CHECK ON PROJ <BUDGET> 500000 AND BUDGET <1000000) Kiểm tra ngân sách của dự án trong khoảng từ 500000 đến 1000000
Ví dụ 6.3.1-6: Ràng buộc miền khi xoá
CHECK ON PROJ WHEN DELETE (BUDGET = 0) Chỉ xoá các bộ giá trị có ngân sách bằng không.
Ví dụ 6.3.1-7: Ràng buộc khi di chuyển
CHECK ON PROJ (NEW.BUDGET>OLD.BUDGET AND NEW.PNO = OLD.PNO)
Ràng buộc tổng quát (general constraint) là công thức của phép tính quan hệ bộ, trong đó tất cả các biến đều được lượng tử hoá. Ràng buộc tổng quát, là tổng quát hơn ràng buộc tiền biên dịch, vì nó có thể tham chiếu đến nhiều quan hệ. Ví dụ, chúng ta phải dùng ít nhất ba ràng buộc tiền biên dịch để diễn tả một ràng buộc tổng quát liên quan đến ba quan hệ. Cú pháp tổng quát của ràng buộc tổng quát có thể được diễn tả như sau:
CHECK ON danh sách <tên biến>: <Tên quan hệ>, (<Lượng từ hoá>) Các ví dụ về ràng buộc tổng quát:
Ví dụ 6.3.1-8: Phụ thuộc hàm
CHECK ON e1:EMP, l2:EMP
(e1.ENAME=e2.ENAME IF e1.ENO = e2.ENO)
Mã số nhân viên ENO xác định hàm tên nhân viên ENAME (Xem ví dụ 6.3.1-4) Ví dụ 6.3.1-9: Ràng buộc có kèm hàm gộp nhóm:
CHECK ON g:ASG, J:PROJ(SUM(g.DUR WHERE g.PNO = j.PNO)<100 IF j.PNAME = “CAD/CAM”
Nghĩa là tổng thời gian của các nhân viên trong dự án CAD/CAM phải nhỏ hơn 100 cưỡng chế thi hành ràng buộc. Cưỡng chế thi hành ràng buộc toàn vẹn bao gồm việc loại bỏ các chương trình cập nhật vi phạm 1 số ràng buộc nào đó. Một ràng buộc
bị vi phạm khi trạng thái mới của CSDL do cập nhật sinh ra, các phán đoán ràng buộc trở nên sai. Có hai phương pháp cơ bản cho phép phế bỏ các cập nhật sinh ra mâu thuẫn là: Dựa vào việc pháp hiện mâu thuẫn và dựa trên việc ngăn chặn mâu thuẫn.
i. Dựa vào việc phát hiện mâu thuẫn: Giả sử khi thực hiện cập nhật u sẽ chuyển hàng của CSDL từ D sang Du. Thuật toán cưỡng chế phải xác nhận rằng tất cả các ràng buộc liên đới vẫn đúng trong Du. Nếu trạng thái Du không nhất quán thì DBMS sẽ cố gắng chuyển sang trạng thái khác là D’u bằng cách hiệu chỉnh Du để D’u nhất quán, nếu không được thì phải quay lại trạng thái D. Cách kiểm tra này được áp dụng sau khi trạng thái của SCDL đã thay đổi nên nó được gọi là kiểm tra sau (Posttest). Cách tiếp cận này sẽ không hiệu quả nếu hệ thống phản hồi lại rất nhiều thao tác khi ràng buộc bị vi phạm.
ii. Dựa trên việc ngăn chặn mâu thuẫn. Một thao tác cập nhật chỉ được thực hiện nếu nó chuyển CSDL sang một trạng thái nhất quán khác. Thuật toán cưỡng chế xác nhận rằng tất cả các ràng buộc liên đới đều đúng sau khi cập nhật các bộ. Như vậy việc kiểm tra được thực hiện trước khi trạng thái CSDL được thay đổi và vì vậy cách kiểm tra được gọi là kiểm tra trước (pretest). Phương pháp ngăn chặn mâu thuẫn hiệu quả hơn phương pháp phát hiện vì chúng ta không phải quay lại trang CSDL trước đó khi có ràng buộc bị vi phạm.
Thuật toán hiệu chỉnh vấn tin là một ví dụ về phương pháp ngăn chặn có hiệu quả đặc biệt trong việc cưỡng chế các ràng buộc miền biến thiên. Nó đưa thêm lượng từ hoá phán đoán vào lượng từ hoá vấn tin bằng toán tử AND cho nên câu vấn tin được hiệu chỉnh có thể được cưỡng chế toàn vẹn.
Ví dụ 6.3.1-10
UPDATE PROJ
SET BUDGET = BUDGET*1.1 WHERE PNAME = “CAD/CAM”
Tăng ngân sách cho các dự án CAD/CAM lên 10%. Câu vấn tin này sẽ biến đổi thành câu vấn tin sau, trong đó có thêm điều kiện nhằm cưỡng chế rằng buộc miền giá trị như đã thấy ở ví dụ 6.3.1-5
UPDATE PROJ
SET BUDGET = BUDGET*1.1 WHERE PNAME = “CAD/CAM” AND NEW. BUDGET ≥ 500000 AND NEW. BUDGET≤ 1000000
Thuật toán hiệu chỉnh vấn tin tạo ra các kiểm tra trước lúc thực thi bằng cách lấy hội các vị từ phán đoán với các vị từ cập nhật của mỗi chỉ thị của giao dịch. Tuy nhiên, thuật toán chỉ áp dụng cho phép tính bộ và được đặc tả như sau:
Xét phán đoán (∀x∈R) F(x) trong đó F là biểu thức quan hệ bộ, x là biến bộ duy nhất. Thao tác cập nhật của R có thể được viết là (∀x∈R)(Q(x)=>update(x)) trong
đó Q là biểu thức pháp tính bộ có biến tự do duy nhất. Hay nói ngắn gọn hơn, hiệu chỉnh vấn tin cần sinh ra thao tác cập nhật (∀x∈R)((Q(x) and F(x)=>update(x). Vì thế x cần phải được lượng từ hoá phổ dụng
Ví dụ 6.3.1-11:
∀g∈ASG, ∃j ∈ PROJ: g.PNO = j.PNO
Đây là phán đoán khoá ngoại (Xem ví dụ 6.3.1-7), nói rằng một dự án được tham chiếu trong quan hệ ASG phải tồn tại (chứ không phải là ∀) trong quan hệ PROJ, do đó j không được lượng từ hoá phổ dụng cho nên câu vấn tin trên không thể được xử lý bởi phép hiệu chỉnh vấn tin.
Phương pháp ngăn chặn mâu thuẫn (kiểm tra trước) khác là dựa vào việc tạo ra các phán đoán. Biên dịch (compiled assertion) vào lúc định nghĩa phán đoán và có thể sử dụng để ngăn chặn sự xuất hiện các mâu thuẫn trong CSDL. Đây là một phương pháp ngăn chặn tổng quát, có thể xử lý được toàn bộ các phán đoán đã được giới thiệu ở trên.
Định nghĩa các phán đoán biên dịch dựa trên khái niệm quan hệ vi phân (differentinal relation). Gọi u là một cập nhật trên quan hệ R; R+ và R- là các quan hệ vi phân của R do u gây ra; R+ gồm các bộ được chèn vào R, còn R- gồm các bộ được xoá khỏi R; R+ = ∅ nếu u là thao tác xoá, R- = ∅ nếu u là thao tác chèn và R+∪(R-R-1) là tập các bộ (từ R) nếu u là sửa đổi bộ.
Một phán đoán biên dịch là bộ ba (R,T,C), trong đó R là quan hệ, T là kiểu cập nhật; C là một phán đoán biến thiên trên các quan hệ vi phân có mặt trong một cập nhật kiểu T. Khi một ràng buộc I được định nghĩa, một tập phán đoán biên dịch có thể được sinh ra cho các quan hệ I được tác động.
Mỗi khi một quan hệ có trong I được cập nhật bởi chương trình u, các phán đoán biên dịch cần phải được kiểm tra chỉ là các phán đoán được định nghĩa trên I cho kiểu cập nhật của u. Các làm này sẽ làm giảm số lượng phán đoán vì chỉ có các phán đoán thuộc kiểu u cần được kiểm tra, chi phí cưỡng chế thi hành cũng nhỏ hơn chi phí cưỡng chế I vì các hệ vi phân nhỏ hơn nhiều so với quan hệ gốc.
Phán đoán biên dịch, thu được bằng cách dùng các qui tắc biến đổi cho phán đoán gốc. Các qui tắc này dựa trên ngữ nghĩa của phán đoán và các hoán vị lượng từ. Chúng cho phép thay các quan hệ cơ sở bằng các quan hệ vị phân. Quá trình tạo ra phán đoán biên dịch từ các quan hệ gốc được gọi là quá trình đơn giản hoá.
Ví dụ 6.3.1-12: (Xét lại ví dụ 6.3.1-11). Phán đoán biên dịch đi kèm với ràng buộc này là:
(ASG, INSERT, C1), (PROJ, DELETE, C2), và (PROJ, MODIFI, C3) Trong đó:
C1 là: ∀NEW∈ASG+, ∃j∈PROJ: NEW.PNO = j.PNO C2 là: ∀g∈ASG, ∀OLD∈PROJ-: g.PNO ≠ OLD.PNO C3 là: ∀g∈ASG, ∀OLD∈PROJ-: ∃NEW∈PROJ+:
g.PNO ≠ OLD.PNO OR OLD.PNO = NEW.PNO Như vậy thuật toán cưỡng chế như sau:
Trước hết tạo ra R+ và R- từ R, sau đó truy xuất các bộ trong R+ và R- để lấy ra các bộ. Ví đụ 6.3.1 – 13:
Thao tác xoá PROJ, cưỡng chế (PROJ, DELETE, C2) tạo ra các câu lệnh sau: Result truy xuất tất cả các bộ của PROJ-, trong đó ¬(C2) đúng phía là ∃g∈ASG, ∃OLD∈PROJ-: g.PNO = OLD.PNO đúng mà Result = ∅; thì phán đoán này đã được xác nhận bởi phép cập nhật.