1. Chuẩn hoá (Normalization)

Chúng ta thực hiện chuẩn hóa cơ sở dữ liệu để tránh dư thừa và xử lý các bất thường có thể xảy ra. Quá trình chuẩn hóa có các cấp độ 1 (1NF), 2 (2NF), 3 (3NF), BCNF, 4 (4NF), 5 (5NF). Bài này sẽ trình bày chi tiết quá trình chuẩn hóa 1NF, 2NF và 3NF vì đây là 3 cấp độ quan trọng nhất. Có thể hình dung quá trình chuẩn hóa như hình sau:

Để hiểu hơn, chúng ta sẽ tìm hiểu một ví dụ về hóa đơn mua hàng sau đó phân tích, tổ chức dữ liệu và chuẩn hóa lần lượt đến 1NF, 2NF và 3NF. Hóa đơn như sau:

Hóa đơn

Mã khách hàng: 12345Hình thức giao hàng: Bưu điện
Khách hàng: Nguyễn A                      
Cam Hòa, Cam Lâm, Khánh Hòa                       0913.115.211
Ngày đặt hàng: 12/1/2008
Mã sản phẩmMô tả sản phẩmSố lượngĐơn giáThành tiền
LHC3249Bình Giữ Nhiệt Lock&Lock Energetic One-Touch Tumbler LHC3249 – 550ML2273.000546.000
LTPV004LĐồng hồ nữ dây da Casio LTP-V004L-1AUDF1535.000535.000
VivoY12sĐiện thoại Vivo Y12s – Hàng Chính Hãng12.890.0002.890.000
M860A11  Giày Chạy Bộ Nam NEW BALANCE M860A11 860v1121.478.0002.956.000
HaylouGT1Tai Nghe Bluetooth True Wireless Haylou GT1 Pro ( Phiên Bản Nâng Cấp Haylou GT1) – Hàng Chính Hãng1368.000368.000
TỔNG TIỀN THANH TOÁN7.295.000

Thông tin từ hóa đơn trên có thể được tổng hợp trong một bảng như sau:

Bảng 1

Từ Bảng 1 để ý rằng, địa chỉ khách hàng gộp các thông tin về xã, huyện và tỉnh; mã sản phẩm, mô tả, số lượng,…gộp chung thông tin trong một ô. Trong mô hình quan hệ thực thể, các cột này gọi là các thuộc tính đa trị (Multi-valued attributes). Lưu trữ thông tin kiểu này sẽ khó khăn trong việc xử lý thông tin sau này như tìm kiếm thông tin về sản phẩm đòi hỏi phải tách các thông tin về mã, mô tả, số lượng,…Hay muốn tìm thông tin về huyện, tỉnh thành trong địa chỉ khách hàng cũng xử lý tương tự.

Do đó, một cách thể hiện khác như bảng sau

Bảng 2

Cách thể hiện Bảng 2 tách địa chỉ khách hàng thành các hai cột là Huyện khách hàngTỉnh khách hàng; các thông tin về sản phẩm được tách riêng thành các hàng riêng biệt. Cách lưu trữ này chứa nhiều hàng lặp thông tin như tên khách hàng, địa chỉ khách hàng,…gây lãng phí bộ nhớ lưu trữ cũng như thời gian khi cập nhật thông tin, ví dụ khi khách hàng Nguyễn A di chuyển tới nơi khác sinh sống hay đổi số điện thoại,…

Để đơn giản, Bảng 2 được thể hiện lại dưới dạng Quan hệ – Thuộc tính như sau:

HÓA ĐƠN: Mã khách hàng, Tên khách hàng, Địa chỉ khách hàng, Huyện khách hàng, Tỉnh khách hàng, Số điện thoại, Hình thức giao hàng, Ngày đặt hàng, Mã sản phẩm, Mô tả sản phẩm, Số lượng, Đơn giá, Thành tiền, Tổng tiền thanh toán

Một vài chú ý:

  • Tên quan hệ hay bảng là chữ viết hoa, in đậm;
  • Các cột hay thuộc tính in nghiêng;
  • Quan hệ và thuộc tính ngăn cách bởi dấu hai chấm. Có nhiều tài liệu về cơ sở dữ liệu đặt các thuộc tính trong cặp ngoặc đơn.

Chúng ta có thể gọi là bảng HÓA ĐƠN hay quan hệ HÓA ĐƠN. Để đơn giản và nhất quán, chúng ta sẽ gọi là bảng HÓA ĐƠN.

Chọn một khóa chính

Chọn khóa chính trong mô hình dữ liệu quan hệ hay định danh duy nhất trong mô hình quan hệ thực thể là bước đầu tiên và quan trọng nhất trước khi bắt đầu quá trình chuẩn hóa. Nếu trong bảng xuất hiện các cột có thể được cân nhắc là khóa chính thì các cột này được gọi là các ứng viên (candidates). Tất nhiên, các ứng viên có thể được chọn hay bị loại. Khi chọn ứng viên là khóa chính, cần tuân theo một vài nguyên tắc:

  • Nếu chỉ có một ứng viên, hãy chọn nó.
  • Chọn ứng viên ít có khả năng thay đổi giá trị nhất. Thay đổi khóa chính một khi bạn lưu trữ dữ liệu trong bảng là một vấn đề phức tạp vì khóa có thể xuất hiện dưới dạng khóa ngoại trong nhiều bảng khác.
  • Chọn ứng viên đơn giản nhất. Thuộc tính bao gồm ít thuộc tính nhất được coi là đơn giản nhất.
  • Chọn ứng viên ngắn nhất. Đây hoàn toàn là một xem xét hiệu quả. Tuy nhiên, khi một khóa chính có thể xuất hiện trong nhiều bảng dưới dạng khóa ngoại, nó thường đáng để tiết kiệm một số không gian với mỗi bảng.

Ở đây chúng ta chọn khóa chính là cột sẽ xác định tính duy nhất cho mỗi hàng trong bảng HÓA ĐƠN. Cột Mã khách hàng có thể được cân nhắc nhưng vì một khách hàng có thể có nhiều hóa đơn nên không thể dùng nó là khóa chính. Các cột khác cũng có thể được cân nhắc nhưng chúng không là duy nhất, ví dụ Tên khách hàng hay Địa chỉ khách hàng có thể trùng nhau.

Khóa chính có thể là sự kết hợp của hai hay nhiều cột. Chúng ta có thể kết hợp cột Mã khách hàng và cột Mã sản phẩm làm khóa chính nhưng cũng vì một khách hàng có thể có nhiều hóa đơn nên các sản phẩm có thể trùng nhau. Tương tự cho sự kết hợp các cột khác.

Nếu không tìm được khóa chính, chúng ta phải phát minh ra nó. Các khóa được phát minh còn được gọi là khóa thay thế (surrogate) hay nhân tạo (artificial). Một cách tình cờ, các khóa thay thế hầu như luôn luôn ít có khả năng thay đổi giá trị hơn so với các khóa tự nhiên. Đây là nguyên tắc rất quan trọng của một khóa chính vì trong mô hình dữ liệu quan hệ, khóa chính có thể là khóa ngoại của rất nhiều bảng. Do không tìm được cột nào phù hợp làm khóa chính cho bảng HÓA ĐƠN nên chúng ta sẽ tạo ra một cột mới tên Mã hóa đơn làm khóa chính (PK):

HÓA ĐƠN: Mã hóa đơn (PK), Mã khách hàng, Tên khách hàng, Địa chỉ khách hàng, Huyện khách hàng, Tỉnh khách hàng, Số điện thoại, Hình thức giao hàng, Ngày đặt hàng, Mã sản phẩm, Mô tả sản phẩm, Số lượng, Đơn giá, Thành tiền, Tổng tiền thanh toán