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:
- 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.
- 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ế.
- Đơ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ý.
- 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 Linxuấ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:
- 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.
- 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.
- 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!
GO TO FULL VERSION