CodeGym /Các khóa học /SQL SELF /Giới thiệu về chuẩn hóa dữ liệu

Giới thiệu về chuẩn hóa dữ liệu

SQL SELF
Mức độ, Bài học
Có sẵn

Bạn đã bao giờ nhìn thấy một bảng trong database mà trông như một kho chứa đồ linh tinh chưa? Một ô thì chứa danh sách số điện thoại, ô khác thì địa chỉ được viết thành một câu dài, ô nữa thì có mấy ngày tháng cách nhau bằng dấu phẩy. Kiểu "hỗn loạn" như vậy làm cho việc tìm kiếm, cập nhật và quản lý dữ liệu trở nên khó khăn. Nhưng vẫn có cách để mọi thứ gọn gàng hơn. Đó chính là chuẩn hóa dữ liệu.

Nói đơn giản, chuẩn hóa dữ liệu là quá trình tổ chức dữ liệu trong các bảng sao cho giảm thiểu sự dư thừa và loại bỏ các vấn đề liên quan đến cập nhật, xóa và chèn dữ liệu.

Chuẩn hóa dữ liệu giải quyết những vấn đề sau:

  1. Loại bỏ dữ liệu trùng lặp. Tại sao phải lưu cùng một thông tin hai lần? Hay ba lần? Điều này làm database phình to và dẫn đến dữ liệu không nhất quán.
  2. Giảm thiểu các anomaly. Bạn biết đấy, trong cuộc sống cũng có những anomaly mà. Ví dụ, quên xóa đồng nghiệp cũ khỏi danh bạ. Trong database cũng vậy. Chuẩn hóa giúp tránh những tình huống khó xử như thế.
  3. Đơn giản hóa cấu trúc dữ liệu. Cấu trúc càng đơn giản thì càng dễ quản lý.
  4. Tăng tốc độ database. Dữ liệu ít hơn — truy vấn nhanh hơn.

Thế nếu không chuẩn hóa thì sao?

Không chuẩn hóa thì dữ liệu trong database sẽ "dính chùm" — lúc nào cũng kéo theo mấy thông tin thừa thãi.

Hãy tưởng tượng bảng Sinh viên:

ID Sinh viên Tên Khóa học
1 Otto Lin Toán học, Vật lý
2 Anna Song Hóa học
3 Otto Lin Sinh học, Hóa học

Những gì có thể xảy ra:

  • Dữ liệu trùng lặp: Otto Lin xuất hiện nhiều lần. Tại sao? Vì bạn ấy học nhiều khóa.
  • Khó cập nhật thông tin: nếu số điện thoại của Otto Lin thay đổi, bạn phải tìm tất cả các dòng có tên bạn ấy để cập nhật số mới.
  • Xóa dữ liệu có thể làm mất tính toàn vẹn: giả sử Otto quyết định bỏ học. Nếu bạn xóa hết các dòng của bạn ấy, sẽ mất luôn thông tin về tên bạn ấy.

Khi nào chuẩn hóa có thể là quá mức?

Nói thật nhé, chuẩn hóa cũng giống như lịch trình nghiêm ngặt: luôn tốt, nhưng đôi khi cũng muốn tự do một chút. Thực tế có những trường hợp denormalization lại hợp lý hơn:

  1. Trong các database phân tích, nơi tốc độ truy vấn quan trọng hơn việc giảm kích thước dữ liệu.
  2. Khi cấu trúc trở nên quá phức tạp: nếu để tuân thủ các normal form mà phải làm việc với hàng chục bảng, truy vấn sẽ ngày càng cồng kềnh.
  3. Với các aggregate thường xuyên dùng: nếu bạn liên tục tính cùng một tổng, tốt nhất là lưu nó lại luôn.

Ví dụ, bạn có một shop online. Nếu người dùng thường xuyên tra cứu tổng số tiền đơn hàng, bạn có thể lưu tổng này trực tiếp trong bảng Đơn hàng thay vì tính lại mỗi lần.

Nhưng nhớ nhé, denormalization là một sự đánh đổi. Nó làm tăng nguy cơ lỗi khi cập nhật dữ liệu.

Ví dụ về cấu trúc có vấn đề và cách chuẩn hóa nó

Cùng xem ví dụ về một bảng trước khi chuẩn hóa:

ID Đơn hàng Khách hàng Sản phẩm Tổng đơn hàng
1 Otto Lin Điện thoại, Tai nghe 20000
2 Anna Song Tủ lạnh 30000
3 Otto Lin Tivi 40000

Rõ ràng có vấn đề:

  • Dữ liệu khách hàng bị lặp lại.
  • Sản phẩm được lưu thành danh sách — vi phạm nguyên tắc dữ liệu nguyên tử.

Sau khi chuẩn hóa

Chúng ta sẽ tách bảng này thành ba bảng: Bảng Khách hàng

ID Khách hàng Tên
1 Otto Lin
2 Anna Song

Bảng Sản phẩm

ID Sản phẩm Tên sản phẩm Giá
1 Điện thoại 10000
2 Tai nghe 10000
3 Tủ lạnh 30000
4 Tivi 40000

Bảng Đơn hàng

ID Đơn hàng ID Khách hàng ID Sản phẩm
1 1 1
1 1 2
2 2 3
3 1 4

Bây giờ chúng ta có:

  • Không còn dữ liệu trùng lặp.
  • Mỗi sản phẩm nằm ở một dòng riêng.
  • Dễ dàng thêm sản phẩm và đơn hàng mới.

Chuẩn hóa là nghệ thuật tạo ra trật tự từ hỗn loạn. Đúng là đôi khi nó có vẻ hơi nghiêm khắc và khó tính, nhưng mục tiêu cuối cùng thì rất xứng đáng. Ở các bài giảng tiếp theo, chúng ta sẽ học về các normal form theo thứ tự: đầu tiên là 1NF, sau đó là 2NF, và cuối cùng là 3NF. Tiến lên nào, đến với thế giới dữ liệu gọn gàng!

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Làm việc với bảng dữ liệu thực tế
Làm việc với bảng dữ liệu thực tế
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION