Chuyển tới nội dung chính

Chương 5: Ràng buộc toàn vẹn

Các điều kiện, quy định mà tất cả thể hiện của quan hệ phải thỏa


1. Giới thiệu

  • Định nghĩa: Ràng buộc toàn vẹn (RBTV) là các quy định, điều kiện từ ứng dụng thực tế. Các điều kiện này là bất biến.
  • Vai trò:
    • Ngăn ngừa mất dữ liệu.
    • Đảm bảo dữ liệu tuân thủ theo các loại và phạm vi giá trị mong đợi.
    • Duy trì liên kết phù hợp giữa dữ liệu trên các bảng khác nhau.
  • Yêu cầu: Phải luôn đảm bảo CSDL thoả RBTV sau mỗi thao tác làm thay đổi tình trạng của CSDL (Thêm, Xóa, Sửa).

2. Các đặc trưng của một ràng buộc toàn vẹn

2.1. Nội dung

Phát biểu bằng ngôn ngữ tự nhiên (dễ hiểu) hoặc ngôn ngữ hình thức (tân từ, đại số quan hệ... để đảm bảo sự chặt chẽ).

2.2. Bối cảnh

Là tập hợp các quan hệ mà khi thao tác trên đó có khả năng làm vi phạm ràng buộc.

2.3. Bảng tầm ảnh hưởng

Bảng 2 chiều xác định thao tác nào cần kiểm tra RBTV.

Ràng buộc RiR_iThêm (T)Xóa (X)Sửa (S)
Quan hệ A++-+(T)+(T)
Quan hệ B-++()-(*)
  • Ký hiệu:
    • ++: Có khả năng vi phạm (cần kiểm tra).
    • -: Không vi phạm (không cần kiểm tra).
    • +(T)+(T): Vi phạm khi sửa thuộc tính TT.
    • ()-(*): Khóa chính không được sửa nên coi như không vi phạm.

3. Phân loại ràng buộc toàn vẹn

Lược đồ CSDL Quản Lý Giáo Vụ (Các thuộc tính gạch chân là Khóa chính)

HOCVIEN(MaHV,Ho,Ten,NgSinh,GioiTinh,NoiSinh,MaLop)\text{HOCVIEN}(\underline{MaHV}, Ho, Ten, NgSinh, GioiTinh, NoiSinh, MaLop)

LOP(MaLop,TenLop,TrgLop,SiSo,MaGVCN)\text{LOP}(\underline{MaLop}, TenLop, TrgLop, SiSo, MaGVCN)

KHOA(MaKhoa,TenKhoa,NgTlap,TrgKhoa)\text{KHOA}(\underline{MaKhoa}, TenKhoa, NgTlap, TrgKhoa)

MONHOC(MaMH,TenMh,TCLT,TCTH,MaKhoa)\text{MONHOC}(\underline{MaMH}, TenMh, TCLT, TCTH, MaKhoa)

DIEUKIEN(MaMH,MaMH_Truoc)\text{DIEUKIEN}(\underline{MaMH, MaMH\_Truoc})

GIAOVIEN(MaGV,HoTen,HocVi,HocHam,GioiTinh,NgSinh,NgVL,HeSo,MucLuong,MaKhoa)\text{GIAOVIEN}(\underline{MaGV}, HoTen, HocVi, HocHam, GioiTinh, NgSinh, NgVL, HeSo, MucLuong, MaKhoa)

GIANGDAY(MaLop,MaMH,MaGV,HocKy,Nam,TuNgay,DenNgay)\text{GIANGDAY}(\underline{MaLop, MaMH}, MaGV, HocKy, Nam, TuNgay, DenNgay)

KETQUATHI(MaHV,MaMH,LanThi,NgThi,Diem,KQua)\text{KETQUATHI}(\underline{MaHV, MaMH, LanThi}, NgThi, Diem, KQua)


3.1. Ràng buộc toàn vẹn có bối cảnh trên 1 quan hệ

3.1.1. Ràng buộc miền giá trị

Ví dụ R1R_1: Giới tính của học viên chỉ là ‘Nam’\text{`Nam'} hoặc ‘Nữ’\text{`Nữ'}.

  • Nội dung: hvHOCVIEN:hv.GioiTinh{‘Nam’,‘Nữ’}\forall \text{hv} \in \text{HOCVIEN} : \text{hv}.GioiTinh \in \{\text{`Nam'}, \text{`Nữ'}\}
  • Bối cảnh: HOCVIEN\text{HOCVIEN}
  • Bảng tầm ảnh hưởng:
R1R_1ThêmXóaSửa
HOCVIEN\text{HOCVIEN}++-+(GioiTinh)+(GioiTinh)

3.1.2. Ràng buộc liên thuộc tính

Ràng buộc giữa các thuộc tính trên cùng một bộ của quan hệ

Ví dụ R2R_2: Ngày bắt đầu giảng dạy phải nhỏ hơn ngày kết thúc.

  • Nội dung: gdGIANGDAY:gd.TuNgay<gd.DenNgay\forall \text{gd} \in \text{GIANGDAY} : \text{gd}.TuNgay < \text{gd}.DenNgay
  • Bối cảnh: GIANGDAY\text{GIANGDAY}
  • Bảng tầm ảnh hưởng:
R2R_2ThêmXóaSửa
GIANGDAY\text{GIANGDAY}++-+(TuNgay,DenNgay)+(TuNgay, DenNgay)

3.1.3. Ràng buộc liên bộ

(Ràng buộc giữa các bộ khác nhau trong cùng một quan hệ)

Ví dụ R3R_3: Tất cả các học viên phải có mã số phân biệt với nhau (RBTV Khóa chính).

  • Nội dung: h1,h2HOCVIEN:h1h2h1.MaHvh2.MaHv\forall \text{h1}, \text{h2} \in \text{HOCVIEN} : \text{h1} \neq \text{h2} \Rightarrow \text{h1}.MaHv \neq \text{h2}.MaHv
  • Bối cảnh: HOCVIEN\text{HOCVIEN}
  • Bảng tầm ảnh hưởng:
R3R_3ThêmXóaSửa
HOCVIEN\text{HOCVIEN}++-()-(*)

Ví dụ R4R_4: Các giáo viên có cùng học vị, cùng hệ số lương thì mức lương sẽ bằng nhau.

  • Nội dung: gv1,gv2GIAOVIEN:(gv1.HocVi=gv2.HocVigv1.HeSo=gv2.HeSo)gv1.MucLuong=gv2.MucLuong\forall \text{gv1}, \text{gv2} \in \text{GIAOVIEN} : (\text{gv1}.HocVi = \text{gv2}.HocVi \wedge \text{gv1}.HeSo = \text{gv2}.HeSo) \Rightarrow \text{gv1}.MucLuong = \text{gv2}.MucLuong
  • Bối cảnh: GIAOVIEN\text{GIAOVIEN}
  • Bảng tầm ảnh hưởng:
R4R_4ThêmXóaSửa
GIAOVIEN\text{GIAOVIEN}++-+(HocVi,HeSo,MucLuong)+(HocVi ,HeSo, MucLuong)

3.2. Ràng buộc toàn vẹn có bối cảnh nhiều quan hệ

3.2.1. Ràng buộc tham chiếu (Khóa ngoại)

Ràng buộc tham chiếu hay còn gọi là ràng buộc phụ thuộc tồn tại hay ràng buộc khóa ngoại

  • Ràng buộc tham chiếu là ràng buộc quy định giá trị thuộc tính trong một bộ của quan hệ R\text{R} (trong đó tập thuộc tính này gọi là khóa ngoại), phải phụ thuộc vào sự tồn tại của một bộ trong quan hệ S\text{S} ( tập thuộc tính này là khóa chính trong quan hệ S).
  • Nói một cách dễ hiểu khi một bảng R\text{R} muốn lưu giá trị nào đó liên quan đến bảng S\text{S}, thì giá trị đó phải tồn tại trong bảng R\text{R}.
  • Bảng R\text{R} có: cột chứa giá trị tham chiếu gọi là khóa ngoại
  • Bảng S\text{S} có: cột chứa giá trị gốc mà bảng R\text{R} tham chiếu tới gọi là khóa chính

Ví dụ R5R_5: Học viên thi một môn học nào đó thì môn học đó phải có trong danh sách môn học.

  • Nội dung: kKETQUATHI,mMONHOC:k.MaMH=m.MaMH\forall \text{k} \in \text{KETQUATHI}, \exists \text{m} \in \text{MONHOC} : \text{k}.MaMH = \text{m}.MaMH
  • Bối cảnh: KETQUATHI\text{KETQUATHI}, MONHOC\text{MONHOC}
  • Bảng tầm ảnh hưởng:
R5R_5ThêmXóaSửa
KETQUATHI\text{KETQUATHI}++-()-(*)
MONHOC\text{MONHOC}-++()-(*)

Giải thích: Xóa môn học ở bảng MONHOC\text{MONHOC} có thể làm bảng KETQUATHI\text{KETQUATHI} bị "mồ côi" dữ liệu \rightarrow Vi phạm.

3.2.2. Ràng buộc liên thuộc tính (giữa các bảng)

Là ràng buộc giữa các thuộc tính trên những quan hệ khác nhau

Ví dụ R6R_6: Ngày giáo viên giảng dạy một môn phải lớn hơn hoặc bằng ngày giáo viên đó vào làm.

  • Nội dung: gdGIANGDAY:neˆˊgvGIAOVIEN:gd.MaGV=gv.MaGVgv.NgVLgd.TuNgay\forall \text{gd} \in \text{GIANGDAY} : \text{nếu } \exists \text{gv} \in \text{GIAOVIEN} : \text{gd}.MaGV = \text{gv}.MaGV \Rightarrow \text{gv}.NgVL \le \text{gd}.TuNgay
  • Bối cảnh: GIANGDAY\text{GIANGDAY}, GIAOVIEN\text{GIAOVIEN}
  • Bảng tầm ảnh hưởng:
R6R_6ThêmXóaSửa
GIANGDAY\text{GIANGDAY}++-+(TuNgay)+(TuNgay)
GIAOVIEN\text{GIAOVIEN}--+(NgVL)+(NgVL)

3.2.3. Ràng buộc do thuộc tính tổng hợp

- Là ràng buộc giữa các thuộc tính, các bộ trên những quan hệ khác nhau.
- Thuộc tính tổng hợp là thuộc tính được tính toán từ giá trị của các thuộc tính khác, các bộ khác.

Ví dụ: (Các thuộc tính in đậm là Khóa chính)
SANPHAM(MaSP,TenSP,NuocSX,Gia)\text{SANPHAM}(\underline{MaSP}, TenSP, NuocSX, Gia)

KHACHHANG(MaKH,HoTen,DoanhSo)\text{KHACHHANG}(\underline{MaKH}, HoTen, DoanhSo)

HOADON(SoHD,NgHD,MaKH,TriGia)\text{HOADON}(\underline{SoHD}, NgHD, MaKH, TriGia)

CTHD(SoHD,MaSP,SoLuong,Gia)\text{CTHD}(\underline{SoHD}, \underline{MaSP}, SoLuong, Gia)

Doanh số của khách hàng bằng tổng trị giá các hóa đơn.

  • Bối cảnh: KHACHHANG\text{KHACHHANG}, HOADON\text{HOADON}

  • Nội dung: khKHACHHANG:kh.DoanhSo={hd.TriGiahdHOADONhd.MaKh=kh.MaKh}\forall \text{kh} \in \text{KHACHHANG} : \text{kh}.DoanhSo = \sum \{ \text{hd}.TriGia \mid \text{hd} \in \text{HOADON} \wedge \text{hd}.MaKh = \text{kh}.MaKh \}

  • Bảng tầm ảnh hưởng:

ThêmXóaSửa
KHACHHANG\text{KHACHHANG}--+(DoanhSo)+(DoanhSo)
HOADON\text{HOADON}+++++(TriGia)+(TriGia)

Bài tập (Trích đề thi cuối kỳ)

Câu hỏi: Hãy phát biểu chặt chẽ RBTV sau: "Đề tài thuộc loại cấp ĐHQG-HCM (Loại A, B, C) đã nghiệm thu (NghiemThu=1) phải có tối thiểu 2 bài báo."

  • Lược đồ: DETAI\text{DETAI}, BAIBAO_KH\text{BAIBAO\_KH}

  • Nội dung: dtDETAI:(dt.LoaiDt{‘A’,‘B’,‘C’}dt.NghiemThu=1)COUNT({bbBAIBAO_KHbb.MaDt=dt.MaDt})2\forall \text{dt} \in \text{DETAI} : (\text{dt}.LoaiDt \in \{\text{`A'}, \text{`B'}, \text{`C'}\} \wedge \text{dt}.NghiemThu = 1) \Rightarrow \text{COUNT}\left(\{\text{bb} \in \text{BAIBAO\_KH} \mid \text{bb}.MaDt = \text{dt}.MaDt\}\right) \ge 2

  • Bảng tầm ảnh hưởng:

RBTVThêmXóaSửa
DETAI\text{DETAI}--+(LoaiDT,NghiemThu)+(LoaiDT, NghiemThu)
BAIBAO_KH\text{BAIBAO\_KH}-+++(MaDT)+(MaDT)