Third Normal Form (3NF) trong SQL



Một bảng là theo Third Normal Form (3NF) khi nó thỏa mãn các điều kiện sau:

  • Nó là một bảng theo Second Normal Form (2NF).

  • Tất cả các trường mà không phải là primary là phụ thuộc vào primary key.

Sự phụ thuộc của các trường không phải là primary là sự phụ thuộc giữa dữ liệu. Ví dụ, trong bảng dưới đây, tên Phường, Quận, và Thành phố là được kết nối (mà không thể phá vỡ) tới một zip code.

CREATE TABLE KHACHHANG(
       KH_ID       INT              NOT NULL,
       KH_TEN     VARCHAR (20)      NOT NULL,
       DOB           DATE,
       PHUONG        VARCHAR(200),
       QUAN          VARCHAR(100),
       THANHPHO         VARCHAR(100),
       ZIP           VARCHAR(12),
       EMAIL_ID      VARCHAR(256),
       PRIMARY KEY (KH_ID)
);

Sự phụ thuộc giữa các zip code và DIACHI được gọi là phụ thuộc có tính bắc cầu. Để tuân theo Third Normal Form (3NF), điều bạn cần làm là di chuyển các trường PHUONG, QUAN, THANHPHO vào trong bảng riêng của chúng, mà bạn có thể gọi là bảng Zip Code.

CREATE TABLE DIACHI(
       ZIP           VARCHAR(12),
       PHUONG        VARCHAR(200),
       QUAN          VARCHAR(100),
       THANHPHO         VARCHAR(100),
       PRIMARY KEY (ZIP)
);

Bây giờ, biến đổi bảng KHACHHANG như sau:

CREATE TABLE KHACHHANG(
       KH_ID       INT              NOT NULL,
       KH_TEN     VARCHAR (20)      NOT NULL,
       DOB           DATE,
       ZIP           VARCHAR(12),
       EMAIL_ID      VARCHAR(256),
       PRIMARY KEY (KH_ID)
);

Việc gỡ bỏ các phụ thuộc có tính bắc cầu đem lại cho ta hai lợi thế. Đầu tiên, lượng bản sao dữ liệu bị giảm xuống và vì thế Database của bạn trở nên nhỏ hơn.

Lợi thế thứ hai là toàn vẹn dữ liệu. Khi dữ liệu bị sao thay đổi, có một rủi ro lớn xảy ra khi chỉ cập nhật một số dữ liệu nào đó, đặc biệt kh nếu nó trải dài rộng một số vị trí khác nhau trong Database. Ví dụ, nếu dữ liệu address và zip code được lưu giữ trong 3 hoặc 4 bảng khác nhau, thì bất kỳ thay đổi nào trong zip code sẽ tác động đến mỗi bản ghi trong 3 hay 4 bảng đó.