Mục lục bài họcĐang ở d05-b1
← A-Level Computer Science
0/30 bài đã học xong
Chương 5 · Databases and Data Security · Bài 1/3 của chương · bài 13/30 của A-Level Computer Science

Relational databases and normalisation

Cơ sở dữ liệu quan hệ và chuẩn hoá
← Mục lục bài học
Lý thuyết · English

Why not a single flat file

A flat file repeats the same data on every row. That wastes space, but the real cost is update anomalies: change a customer's address and you must find every row containing it, and any row you miss now holds a contradiction. A relational database stores each fact once.

The vocabulary

An entity becomes a table; an attribute becomes a field; a record is one row. A primary key uniquely identifies a record. A foreign key is a primary key of another table used to link them. A composite key uses two or more fields together, which is what a link table needs. Referential integrity means a foreign key must match an existing primary key — the database refuses to create an orphan record.

Normalisation

1NF: no repeating groups; every field holds a single atomic value. 2NF: in 1NF, and every non-key field depends on the whole primary key — this only bites when the key is composite. 3NF: in 2NF, and no non-key field depends on another non-key field (no transitive dependency).

Many-to-many

A relational database cannot store a many-to-many relationship directly. It is resolved by a link table whose primary key is the composite of the two foreign keys — students and courses become students, courses and enrolments.

What normalisation costs

Fewer anomalies and less redundancy, but more tables, so queries need more joins and can run more slowly. That trade-off is the evaluation point: a data warehouse used only for reading is often deliberately denormalised.

Giải thích tiếng Việt

Vì sao không dùng một tệp phẳng duy nhất

Tệp phẳng lặp lại cùng một dữ liệu ở mọi dòng. Điều đó tốn chỗ, nhưng cái giá thật sự là bất thường khi cập nhật: đổi địa chỉ một khách hàng thì phải tìm mọi dòng chứa nó, và bất kỳ dòng nào bỏ sót sẽ trở thành một mâu thuẫn. Cơ sở dữ liệu quan hệ lưu mỗi dữ kiện đúng một lần.

Từ vựng

Một thực thể thành một bảng; một thuộc tính thành một trường; một bản ghi là một dòng. Khoá chính xác định duy nhất một bản ghi. Khoá ngoại là khoá chính của bảng khác, dùng để nối hai bảng. Khoá gộp dùng hai trường trở lên kết hợp, và đó chính là thứ bảng trung gian cần. Toàn vẹn tham chiếu nghĩa là khoá ngoại phải khớp với một khoá chính đang tồn tại — cơ sở dữ liệu từ chối tạo ra bản ghi mồ côi.

Chuẩn hoá

1NF: không có nhóm lặp; mỗi trường chứa đúng một giá trị nguyên tử. 2NF: đã ở 1NF, và mọi trường không khoá phụ thuộc vào toàn bộ khoá chính — điều này chỉ có ý nghĩa khi khoá là khoá gộp. 3NF: đã ở 2NF, và không trường không khoá nào phụ thuộc vào một trường không khoá khác (không có phụ thuộc bắc cầu).

Quan hệ nhiều–nhiều

Cơ sở dữ liệu quan hệ không lưu trực tiếp được quan hệ nhiều–nhiều. Nó được tách bằng một bảng trung gian có khoá chính là tổ hợp của hai khoá ngoại — học sinh và môn học trở thành học sinh, môn học và đăng ký.

Chuẩn hoá phải trả giá gì

Ít bất thường hơn và ít dư thừa hơn, nhưng nhiều bảng hơn, nên truy vấn cần nhiều phép nối và có thể chạy chậm hơn. Chính sự đánh đổi đó là chỗ ăn điểm đánh giá: một kho dữ liệu chỉ dùng để đọc thường được cố tình phi chuẩn hoá.

Quan he nhieu-nhieu phai tach bang bang trung gianHOC_SINHma_hs (PK)ho_tenngay_sinhDANG_KYma_hs (FK)ma_mon (FK)hoc_kyMON_HOCma_mon (PK)ten_monso_tiet1:NN:1Khoa chinh cua DANG_KY = (ma_hs, ma_mon) — khoa gopKhong co bang giua thi phai lap du lieu, va lap la sinh mau thuan
Bảng trung gian là câu trả lời cho mọi quan hệ nhiều–nhiều. Nhận ra nó và đặt đúng khoá gộp là phần lớn số điểm của câu thiết kế cơ sở dữ liệu.
Ví dụ — chuẩn hoá một bảng về 3NF

Một bảng duy nhất lưu đơn hàng:

ma_don, ngay, ma_kh, ten_kh, dia_chi_kh, ma_sp, ten_sp, don_gia, so_luong

Một đơn hàng có thể chứa nhiều sản phẩm. Chuẩn hoá về 3NF.

Giải.

Bước 1 — về 1NF. Vì một đơn có nhiều sản phẩm, các trường sản phẩm tạo thành nhóm lặp. Tách dòng để mỗi dòng là một sản phẩm trong một đơn. Khoá chính khi đó phải là khoá gộp (ma_don, ma_sp).

Bước 2 — về 2NF: bỏ phụ thuộc vào MỘT PHẦN khoá.

ngay, ma_kh, ten_kh, dia_chi_kh chỉ phụ thuộc ma_don, không phụ thuộc ma_sp ⇒ tách ra bảng DON_HANG.

ten_sp, don_gia chỉ phụ thuộc ma_sp ⇒ tách ra bảng SAN_PHAM.

so_luong phụ thuộc cả hai ⇒ ở lại bảng trung gian.

Bước 3 — về 3NF: bỏ phụ thuộc bắc cầu. Trong bảng DON_HANG, ten_khdia_chi_kh phụ thuộc ma_kh, mà ma_kh lại phụ thuộc ma_don — đó là phụ thuộc bắc cầu. Tách ra bảng KHACH_HANG.

Kết quả — bốn bảng:

KHACH_HANG(ma_kh, ten_kh, dia_chi_kh)
SAN_PHAM(ma_sp, ten_sp, don_gia)
DON_HANG(ma_don, ngay, ma_kh*)
CHI_TIET_DON(ma_don*, ma_sp*, so_luong)

(gạch chân $=$ khoá chính, dấu $*$ $=$ khoá ngoại)

Lợi ích cụ thể. Khách hàng chuyển nhà thì sửa đúng MỘT dòng trong KHACH_HANG thay vì tìm hết mọi dòng đơn hàng của họ — và vì sửa một chỗ nên không thể phát sinh mâu thuẫn.

Bẫy hay mất điểm — Coi 2NF là “tách bảng cho gọn”. 2NF chỉ có ý nghĩa khi khoá chính là KHOÁ GỘP: nó loại các trường chỉ phụ thuộc một PHẦN của khoá. Nếu khoá chính chỉ có một trường thì bảng ở 1NF đã tự động ở 2NF.
Phải nhớ — 1NF bỏ nhóm lặp, 2NF bỏ phụ thuộc một phần khoá, 3NF bỏ phụ thuộc bắc cầu. Quan hệ nhiều–nhiều luôn cần bảng trung gian với khoá gộp. Và luôn nêu được cái giá: nhiều bảng thì nhiều phép nối hơn.

Đọc xong rồi — làm thử ngay

Bài tập của chương Databases and Data Security gồm 14 câu trắc nghiệm và 3 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.

Làm bài tập chương →