Chuẩn hoá cơ sở dữ liệu là cách sắp xếp cột vào các bảng sao cho mỗi thông tin chỉ được lưu ở một chỗ, để thêm, sửa, xoá không làm dữ liệu tự mâu thuẫn. Ba mức hay gặp nhất là dạng chuẩn 1 (1NF), 2 (2NF) và 3 (3NF); mỗi mức là một câu hỏi kiểm tra đặt lên bảng của bạn. Đi qua đủ ba câu hỏi, phần lớn bảng nghiệp vụ của doanh nghiệp nhỏ đã đủ gọn để dùng lâu dài.
Ở đây chữ "chuẩn hoá" mang nghĩa thiết kế bảng, khác với chuẩn hoá dữ liệu theo nghĩa làm sạch (viết hoa họ tên, thống nhất định dạng ngày). Bài dùng ví dụ giả định của một cửa hàng phụ tùng xe máy ở Đắk Lắk và một văn phòng dịch vụ kế toán, giải thích từng dạng chuẩn bằng chính những bảng bạn đang gặp, kèm cách nhờ AI soát lại và những lúc nên cố tình không chuẩn hoá.
Chuẩn hoá để tránh ba kiểu lỗi khi thêm, sửa, xoá
Lỗi khi sửa. Bảng đơn hàng lưu kèm tên và số điện thoại khách trên mỗi dòng. Khách đổi số, người nhập sửa ba dòng gần nhất và bỏ sót mười dòng cũ. Giờ cùng một khách có hai số, và không ai biết số nào còn dùng. Người thiết kế gọi đây là bất thường khi cập nhật.
Lỗi khi thêm. Cửa hàng nhập về một loại má phanh mới nhưng chưa bán được chiếc nào. Nếu thông tin sản phẩm chỉ nằm trong bảng đơn hàng thì không có chỗ ghi mặt hàng này, trừ khi tạo một đơn hàng giả. Dữ liệu buộc phải chờ một sự việc khác xảy ra mới được tồn tại.
Lỗi khi xoá. Xoá đơn hàng duy nhất của một khách để sửa sai, cửa hàng mất luôn mọi thông tin về khách đó. Thông tin của một đối tượng bị kéo theo khi xoá một đối tượng khác.
Gốc chung của cả ba lỗi. Cả ba đều sinh ra từ việc một bảng chứa thông tin của hơn một loại đối tượng. Chuẩn hoá là cách lần lượt phát hiện và tách các đối tượng đó ra. Nó không nhằm cho đẹp hay cho đúng sách, mà để bảng không tự sinh mâu thuẫn khi dữ liệu lớn dần và nhiều người cùng nhập.
Dạng chuẩn 1: mỗi ô một giá trị, không có nhóm cột lặp
Một bảng đạt dạng chuẩn 1 khi mỗi ô chỉ chứa một giá trị không chia nhỏ hơn theo nghĩa nghiệp vụ, không có nhóm cột lặp lại, và mỗi dòng phân biệt được với mọi dòng khác nhờ một khoá chính. Ba vi phạm hay gặp trong bảng tính văn phòng: ô "Số điện thoại" ghi hai số cách nhau dấu phẩy; ô "Hàng mua" ghi "2 má phanh, 1 dây curoa"; và các cột Sản phẩm 1, Sản phẩm 2, Sản phẩm 3.
Cách sửa là đưa các giá trị lặp xuống thành dòng. Bảng đơn hàng giữ một dòng mỗi đơn; các món trong đơn chuyển sang bảng chi tiết, mỗi món một dòng gồm mã đơn, mã hàng, số lượng. Số điện thoại thứ hai của khách, nếu thật sự cần, chuyển sang một bảng liên hệ riêng hoặc hai cột có nghĩa rõ ràng như điện thoại chính và điện thoại phụ, chứ không ghi chung một ô.
Chữ "không chia nhỏ hơn" cần hiểu theo việc bạn làm. Ô địa chỉ ghi cả số nhà, đường, phường, tỉnh vẫn có thể coi là một giá trị nếu cửa hàng chỉ dùng nó để in phiếu giao. Nhưng nếu bạn cần lọc khách theo tỉnh thì tỉnh phải tách ra cột riêng, vì lúc đó tỉnh là một giá trị nghiệp vụ độc lập. Cũng vậy với họ tên: tách họ và tên hay không là tuỳ có ai cần sắp xếp theo tên hay không, không có đáp án chung.
Dạng chuẩn 2: cột phải phụ thuộc vào toàn bộ khoá
Dạng chuẩn 2 chỉ có ý nghĩa với bảng mà khoá chính gồm hai cột trở lên. Lấy bảng chi tiết đơn hàng: một dòng được xác định bởi cặp mã đơn và mã hàng. Giả sử bảng có thêm cột tên hàng và đơn vị tính. Tên hàng chỉ phụ thuộc vào mã hàng, không liên quan gì đến mã đơn: má phanh mã MP-02 thì tên vẫn thế dù nằm trong đơn nào. Đó là phụ thuộc một phần vào khoá, và là vi phạm dạng chuẩn 2.
Hệ quả thực tế: tên hàng bị chép lại trong mỗi đơn có món đó. Đổi tên hàng cho dễ hiểu thì các đơn cũ vẫn mang tên cũ, báo cáo theo tên ra hai dòng cho một mặt hàng. Cách sửa là đưa tên hàng, đơn vị tính về bảng sản phẩm, nơi mã hàng là khoá chính duy nhất; bảng chi tiết chỉ giữ những gì thật sự phụ thuộc vào cả cặp khoá — số lượng, đơn giá bán của món đó trong đơn đó, mức giảm áp cho món đó.
Khái niệm đứng sau là phụ thuộc hàm: nói cột A xác định cột B khi mỗi giá trị của A luôn đi với đúng một giá trị của B. Mã hàng xác định tên hàng; cặp mã đơn và mã hàng xác định số lượng. Bạn không cần thuộc định nghĩa, chỉ cần tập thói quen hỏi với từng cột: biết giá trị của cột nào thì suy ra được cột này? Nếu câu trả lời là chỉ một phần của khoá, cột đó đang ở nhầm bảng.
Dạng chuẩn 3: không có cột nào phụ thuộc qua trung gian
Một bảng ở dạng chuẩn 3 khi đã đạt dạng chuẩn 2 và không cột thường nào phụ thuộc vào một cột thường khác. Ví dụ ở văn phòng dịch vụ kế toán: bảng nhân viên có mã nhân viên, họ tên, mã phòng, tên phòng, trưởng phòng. Mã nhân viên xác định mã phòng, và mã phòng lại xác định tên phòng, trưởng phòng. Tên phòng phụ thuộc vào khoá chỉ qua trung gian là mã phòng — gọi là phụ thuộc bắc cầu.
Hậu quả giống các lỗi ở trên: phòng đổi trưởng phòng thì phải sửa trên mọi dòng nhân viên của phòng; phòng mới lập chưa có ai thì không có chỗ ghi; người cuối cùng nghỉ việc thì mất luôn thông tin phòng. Cách sửa là tách bảng phòng ban với mã phòng làm khoá, bảng nhân viên chỉ giữ mã phòng.
Ở bảng đơn hàng của cửa hàng phụ tùng cũng có dạng này: đơn hàng mang mã khách, và nếu đơn còn mang thêm tên khách, tỉnh của khách thì đó là phụ thuộc bắc cầu qua mã khách. Một ví dụ khó nhận ra hơn: bảng khách có cột tỉnh và cột vùng (miền Bắc, miền Trung, miền Nam). Vùng phụ thuộc vào tỉnh chứ không vào khách; khi danh sách tỉnh thay đổi như đợt sắp xếp còn 34 tỉnh thành từ tháng 7 năm 2025, sửa trong một bảng tỉnh dễ hơn nhiều so với sửa từng khách.
Sau dạng chuẩn 3 còn dạng chuẩn Boyce–Codd (BCNF) và các dạng cao hơn, xử lý những trường hợp có nhiều khoá ứng viên chồng lên nhau. Với bảng nghiệp vụ của doanh nghiệp nhỏ, rất hiếm khi cần đi tới đó; đạt dạng chuẩn 3 đã loại gần hết dư thừa gây lỗi.
Bảng tự kiểm ba dạng chuẩn trong năm phút
Bảng dưới gom mỗi dạng chuẩn thành một câu hỏi bạn đặt cho bảng của mình, dấu hiệu vi phạm hay gặp trong bảng tính và cách sửa.
| Dạng chuẩn | Câu hỏi tự kiểm | Dấu hiệu vi phạm | Cách sửa |
|---|---|---|---|
| 1NF | Mỗi ô có đúng một giá trị và mỗi dòng có khoá phân biệt không? | Ô ghi nhiều số điện thoại; cột Món 1, Món 2; hai dòng giống hệt nhau | Đưa giá trị lặp xuống thành dòng ở bảng con; thêm cột mã làm khoá |
| 2NF | Với khoá gồm nhiều cột, có cột nào chỉ phụ thuộc vào một phần khoá không? | Bảng chi tiết đơn chứa tên hàng, đơn vị tính | Chuyển cột đó về bảng có khoá là phần khoá mà nó phụ thuộc |
| 3NF | Có cột thường nào được suy ra từ một cột thường khác không? | Bảng nhân viên chứa tên phòng; bảng khách chứa vùng theo tỉnh | Tách bảng mới cho cột trung gian, giữ lại mã của nó |
| BCNF | Mọi cột xác định cột khác có phải là khoá ứng viên không? | Hiếm gặp ở bảng văn phòng; thường do quy tắc phân công chồng chéo | Tách theo phụ thuộc gây vi phạm; nên hỏi người có chuyên môn |
Mẹo đọc bảng: nếu bạn phải giải thích cho người mới "cột này thì lấy theo cột kia", đó gần như chắc chắn là một phụ thuộc cần xem lại. Một bảng đạt chuẩn thường có thể giải thích bằng một câu: mọi cột trong bảng mô tả đúng khoá, toàn bộ khoá, và không gì khác ngoài khoá.
Nhờ AI soát dạng chuẩn cho bảng của bạn
Trợ lý AI giải thích dạng chuẩn khá tốt và phát hiện nhanh các vi phạm lộ liễu. Điểm yếu của nó là không biết quy tắc nghiệp vụ, mà dạng chuẩn lại dựa hoàn toàn vào quy tắc nghiệp vụ.
- Chuẩn bị mô tả bảng thay vì dữ liệu: tên bảng, danh sách cột, cột nào là khoá. Nếu cần ví dụ, chỉ đưa vài dòng giả định, không có tên hay số điện thoại thật của khách, nhân viên.
- Viết rõ các quy tắc bạn biết: một khách có nhiều số điện thoại hay chỉ một; một nhân viên thuộc một phòng hay nhiều phòng; giá bán có thay đổi theo từng đơn không.
- Gửi câu lệnh mẫu: "Dưới đây là cấu trúc ba bảng của một cửa hàng nhỏ cùng các quy tắc nghiệp vụ. Liệt kê các phụ thuộc hàm suy ra từ quy tắc, chỉ ra bảng nào vi phạm 1NF, 2NF hoặc 3NF, giải thích bằng ví dụ giả định cụ thể, rồi đề xuất cách tách. Nếu thiếu quy tắc để kết luận thì hỏi lại, không giả định."
- Đọc danh sách phụ thuộc hàm AI đưa ra và gạch những phụ thuộc không đúng với thực tế cửa hàng. Đây là bước quan trọng nhất: một phụ thuộc sai dẫn đến một bảng thừa hoặc một bảng thiếu.
- Thử thiết kế mới bằng ba câu hỏi ở phần đầu: đổi tên một mặt hàng phải sửa mấy chỗ, thêm một mặt hàng chưa bán có được không, xoá một đơn có mất thông tin khách không.
Một lỗi AI hay mắc là coi mọi cột có giá trị lặp là vi phạm và đề xuất tách tràn lan. Cột trạng thái đơn chỉ có năm giá trị cố định không cần bảng riêng; lặp giá trị không có nghĩa là dư thừa nếu giá trị đó không kéo theo thông tin nào khác.
Khi nào nên cố ý không chuẩn hoá
Chuẩn hoá là điểm xuất phát, không phải luật cấm. Có những chỗ người thiết kế có kinh nghiệm cố tình lưu lặp, gọi là phi chuẩn hoá, và làm vậy vì một lý do nghiệp vụ rõ ràng chứ không phải vì lười tách.
Trường hợp phổ biến nhất là giá trị tại thời điểm giao dịch. Bảng chi tiết đơn lưu đơn giá bán dù bảng sản phẩm đã có giá niêm yết, vì giá đổi theo thời gian mà đơn cũ phải giữ đúng số tiền. Tương tự, hoá đơn lưu tên và địa chỉ người mua tại thời điểm xuất, vì giấy tờ đã phát hành không được thay đổi theo hồ sơ khách sau này. Ở đây hai giá trị trông giống nhau nhưng thật ra là hai thông tin khác nhau: giá hiện hành và giá đã bán.
Trường hợp thứ hai là bảng phẳng để đọc. Khi cần một bảng gộp đủ tên khách, tên hàng, tỉnh, tháng để đưa vào báo cáo hoặc công cụ phân tích, người ta tạo bảng đó từ các bảng chuẩn hoá, chứ không nhập liệu trực tiếp vào nó. Bảng phẳng là bản sao sinh ra, có thể xoá và tạo lại bất cứ lúc nào; còn đọc ý nghĩa từ bảng ấy là việc của trang AI Phân Tích.
Nguyên tắc chung: mọi chỗ lưu lặp phải có một nguồn gốc rõ và một cách kiểm. Nếu bạn không nói được vì sao một cột được lưu lặp và lấy số đúng từ đâu khi hai chỗ lệch nhau, đó không phải phi chuẩn hoá có chủ ý mà là một lỗi thiết kế chưa được sửa.
Câu hỏi thường gặp
Bảng Excel có cần đạt dạng chuẩn 3 không hay chỉ phần mềm cơ sở dữ liệu mới cần?
Nguyên lý giống nhau cho cả hai. Bảng tính dùng lâu, nhiều người nhập, nhiều nghìn dòng sẽ gặp đúng các lỗi khi sửa, thêm, xoá như cơ sở dữ liệu. Bảng dùng một lần để tính nhanh thì không cần cầu kỳ.
Chuẩn hoá nhiều có làm chậm việc tra cứu không?
Với dữ liệu cỡ doanh nghiệp nhỏ, vài chục nghìn dòng, việc nối thêm một hai bảng hầu như không gây chậm đáng kể trong cơ sở dữ liệu. Trong bảng tính, nhiều công thức tra cứu chéo có thể chậm hơn; khi đó nên dùng bảng Table và hạn chế tham chiếu cả cột.
Làm sao biết một cột phụ thuộc vào cột nào?
Đặt câu hỏi nghiệp vụ: biết giá trị cột này thì có luôn suy ra đúng một giá trị cột kia không, kể cả trong tương lai. Câu trả lời đến từ người hiểu công việc, không phải từ việc nhìn dữ liệu hiện có, vì dữ liệu ít có thể trùng hợp ngẫu nhiên.
Khoá chính có bắt buộc phải là một cột mã tự tăng không?
Không bắt buộc, nhưng thường tiện nhất. Một số bảng có khoá tự nhiên gồm nhiều cột như mã đơn cộng mã hàng. Nhiều người vẫn thêm cột mã riêng cho mỗi dòng để dễ tham chiếu, đồng thời giữ ràng buộc không trùng trên cặp cột tự nhiên.
AI nói bảng của mình đã đạt 3NF thì có tin được không?
Chỉ nên coi là ý kiến tham khảo. AI kết luận dựa trên quy tắc bạn mô tả và những giả định nó tự đặt ra. Hãy yêu cầu nó liệt kê phụ thuộc hàm đã dùng, rồi tự kiểm từng phụ thuộc với thực tế công việc trước khi tin.
Dữ liệu cũ chưa chuẩn hoá thì có cần sửa hết một lần không?
Không cần. Nhiều nơi giữ dữ liệu cũ ở dạng chỉ đọc, áp thiết kế mới cho dữ liệu từ một ngày nhất định, rồi chuyển dần dữ liệu cũ khi có thời gian. Cách này tránh làm gián đoạn công việc hằng ngày.