First Normal Form (1NF) — là giai đoạn đầu tiên của việc chuẩn hóa database, đặt ra giới hạn nghiêm ngặt cho cấu trúc bảng. Một bảng được coi là đạt 1NF nếu:
- Tất cả dữ liệu là nguyên tử. Mỗi giá trị trong ô bảng phải không thể chia nhỏ hơn nữa. Tạm biệt kiểu "danh sách trong một ô"! Trong database thì không chơi kiểu đó đâu nha.
- Mỗi dòng là duy nhất. Nghĩa là bảng phải có primary key hoặc một định danh duy nhất.
- Không có nhóm dữ liệu lặp lại. Giá trị của cùng một thực thể không được xuất hiện nhiều lần trong cùng một cột.
Nói dễ hiểu, hãy tưởng tượng bảng database là căn phòng của bạn, còn giá trị nguyên tử là từng món đồ riêng biệt: đèn, bàn, sách. Nếu phòng bạn bừa bộn (kiểu mọi thứ vứt chung một chỗ), bạn sẽ không thể tìm thấy cái đèn hoặc biết ngay có bàn dự phòng không. Chuẩn hóa giúp bạn "xếp mọi thứ lên kệ gọn gàng".
Ví dụ vi phạm 1NF
Giả sử bạn có bảng sinh viên, lưu thông tin về các khóa học mà họ tham gia:
| student_id | name | courses |
|---|---|---|
| 1 | Maria | "Toán học, Vật lý" |
| 2 | Rob | "Sinh học, Hóa học" |
Cấu trúc này có gì không ổn? Các khóa học (cột courses) được ghi bằng dấu phẩy trong một ô. Điều này có nghĩa là nếu bạn muốn tìm tất cả sinh viên học vật lý, thì query sẽ thành ác mộng: phải xử lý text phức tạp. Nếu một sinh viên muốn xóa vật lý khỏi danh sách — lại thêm vấn đề mới. Dữ liệu như vậy không phải là nguyên tử, vi phạm nguyên tắc chính của 1NF.
Làm sao đưa bảng về 1NF?
Để giải quyết, ta sẽ tách dữ liệu thành từng dòng riêng biệt, mỗi giá trị trong bảng là nguyên tử:
| student_id | name | course |
|---|---|---|
| 1 | Maria | Toán học |
| 1 | Maria | Vật lý |
| 2 | Rob | Sinh học |
| 2 | Rob | Hóa học |
Bây giờ thì ổn rồi. Ta đã chuyển bảng sao cho mỗi giá trị trong ô là không thể chia nhỏ. Đúng chuẩn 1NF luôn.
Ví dụ chi tiết về vi phạm 1NF và cách sửa
Giả sử bạn có bảng đơn hàng của shop online:
| order_id | customer_name | items |
|---|---|---|
| 1001 | Otto Lin | "Laptop, Chuột, Bàn phím" |
| 1002 | Anna Song | "Smartphone, Ốp lưng" |
Rõ ràng ở đây items chứa nhiều giá trị ngăn cách bằng dấu phẩy, vi phạm 1NF.
Để đưa dữ liệu về 1NF, ta sẽ lưu mỗi dòng cho từng sản phẩm trong đơn hàng:
| order_id | customer_name | item |
|---|---|---|
| 1001 | Otto Lin | Laptop |
| 1001 | Otto Lin | Chuột |
| 1001 | Otto Lin | Bàn phím |
| 1002 | Anna Song | Smartphone |
| 1002 | Anna Song | Ốp lưng |
Bây giờ cấu trúc bảng đã đúng chuẩn 1NF. Mỗi đơn hàng và sản phẩm là một dòng riêng, giá trị nguyên tử.
Thêm primary key
Sau khi chuyển đổi bảng, quan trọng là phải thêm định danh duy nhất (primary key) cho mỗi dòng để đảm bảo tính duy nhất. Ở ví dụ trên, bạn có thể dùng kết hợp order_id và item làm primary key tổng hợp. Nhưng thực tế thì thường tạo thêm trường id riêng.
| id | order_id | customer_name | item |
|---|---|---|---|
| 1 | 1001 | Otto Lin | Laptop |
| 2 | 1001 | Otto Lin | Chuột |
| 3 | 1001 | Otto Lin | Bàn phím |
| 4 | 1002 | Anna Song | Smartphone |
| 5 | 1002 | Anna Song | Ốp lưng |
Bài tập thực hành
Bạn có bảng sinh viên với các môn học mà họ học, được ghi trong một ô:
| student_id | name | subjects |
|---|---|---|
| 1 | Polly | "Toán học, Hóa học" |
| 2 | Peter | "Vật lý, Tin học" |
Hãy chuyển bảng này về dạng đúng chuẩn 1NF.
Sau khi chuyển đổi, bảng sẽ như sau:
| student_id | name | subject |
|---|---|---|
| 1 | Polly | Toán học |
| 1 | Polly | Hóa học |
| 2 | Peter | Vật lý |
| 2 | Peter | Tin học |
Những lỗi thường gặp khi làm việc với 1NF
Khi bạn làm việc với database, lỗi vi phạm 1NF thường xuất hiện trong các trường hợp sau:
- Lưu danh sách hoặc mảng trực tiếp trong bảng. Đây là lỗi phổ biến nhất.
- Không có định danh duy nhất cho dòng (primary key). Điều này làm bảng dễ bị trùng dữ liệu.
- Dùng nhiều cột để lưu cùng một loại thông tin. Ví dụ, "course_1", "course_2", "course_3" — thay vì cấu trúc đúng chuẩn.
Nhớ mấy điểm này, database của bạn sẽ luôn đúng chuẩn First Normal Form.
Ứng dụng thực tế của 1NF
Trong dự án thực tế, 1NF cực kỳ quan trọng. Ví dụ:
- Trong app quản lý khách hàng (CRM), dữ liệu về khách và hành động của họ phải là nguyên tử. Như vậy mới dễ phân tích và tìm kiếm.
- Trong shop online, 1NF giúp lưu thông tin đơn hàng, sản phẩm và khách hàng hiệu quả.
- Trong hệ thống ngân hàng, dữ liệu về khách, tài khoản và giao dịch bắt buộc phải nguyên tử để tránh nhầm lẫn giữa các thao tác khác nhau.
Tuân thủ 1NF giúp bạn thiết kế database chịu tải cao và dễ dùng. Tuyệt vời, nhưng sẽ có lặp dữ liệu. Vì vậy ta sẽ chuyển sang Second Normal Form (2NF), nơi bạn sẽ hiểu cách xử lý phụ thuộc từng phần trong bảng.
Tại sao phải tuân thủ First Normal Form (1NF)? Hãy tưởng tượng bạn lưu dữ liệu trong bảng mà một ô có thể chứa nhiều giá trị — ví dụ, danh sách sản phẩm mà khách đặt. Lúc này, việc truy xuất dữ liệu sẽ rất khó: tìm tất cả ai đặt "Bàn phím" sẽ cực kỳ mệt. Nếu cần sửa hoặc xóa một phần thông tin, rất dễ sai sót. Khi dữ liệu lưu ở dạng nguyên tử — tức là mỗi trường chỉ chứa một giá trị — thì làm việc với nó sẽ an toàn và dễ hiểu hơn nhiều. Ngoài ra, bảng như vậy cũng dễ mở rộng, cập nhật và tái cấu trúc khi cần.
GO TO FULL VERSION