Cách chuẩn hóa Cơ sở dữ liệu từ 1 bảng thành các bảng có quan hệ

Ví dụ: ta cần lưu trữ thông tin Sản phẩm, và Chuyên mục để phân loại Sản phẩm trong table sanpham như sau:
  • sp_id: ID tự tăng dùng để định danh duy nhất 1 Sản phẩm
  • sp_ten: tên Sản phẩm
  • sp_gia: giá bán Sản phẩm
  • lsp_ten: sản phẩm thuộc Loại nào đó

Cách lưu trữ tất cả thông tin trong cùng 1 table sanpham này có vài điểm hạn chế:

Dư thừa dữ liệu

Xem xét ví dụ trên, chúng ta phân tích như sau:   Cùng 1 chuỗi "Điện thoại", lại xuất hiện dư thừa đến 3 lần trong dữ liệu trên. Ví dụ:
  • Chuỗi Điện thoại10 ký tự, mỗi ký tự tốn 2 bytes để lưu trữ => cần 10 * 2 = 20 bytes để lưu trữ hết chuỗi này
  • Việc xuất hiện dư thừa đến 3 lần, làm chúng ta tiêu tốn 3 lần * 20 bytes = 60 bytes dung lượng lưu trữ
Trong mô hình thiết kế Cơ sở dữ liệu chuẩn 3, quy tắc là không được xuất hiện dư thừa dữ liệu.

Cách giải quyết

Step 1: Tách dữ liệu ra thành 2 bảng (table):

  • Table sanpham
  • Table loaisanpham

Step 2: xác định quan hệ giữa 2 table sanphamloaisanpham

Ta có quan hệ như sau:
  • 1 Sản phẩm thì thuộc một Loại sản phẩm nào đó
  • 1 Loại sản phẩm thì có thể không có hoặc có nhiều Sản phẩm

Step 3: khởi tạo cột dùng để liên kết giữa 2 bảng và tạo liên kết Khóa ngoại

Do quan hệ chúng ta sử dụng là Không-Nhiều (0-n) hay Một-Nhiều (1-n) => còn gọi là quan hệ dạng Cha-Con (Master-Detail), nên sẽ có một số quy tắc thiết kế như sau:
  • Cột khóa ngoại (Foreign key - FK) sẽ được đặt bên table con (detail) sanpham, với một số quy tắc sau:
    • Quy cách đặt tên: thường đặt tên giống như cột khóa chính (Primary key - PK) bên table cha loaisanpham.
    • Để có thể tạo quan hệ ràng buộc Khóa ngoại với nhau thì kiểu dữ liệu của cột Khóa ngoại (bên table sanpham) và Khóa chính (bên table loaisanpham) phải giống hệt nhau.

Thực hành

Tạo khóa ngoại cho table shop_products và table shop_categories trong HeidiSQL:

Step 1: tạo table shop_categories

Step 2: tạo table shop_products

Step 3: tạo khóa ngoại Foreign Key liên kết giữa 2 table

Step 4: nhập dữ liệu data cho table shop_categories

Step 5: nhập dữ liệu data cho table shop_products

Xong!