Khoá định danh là một cột mà giá trị ở mỗi dòng là duy nhất và không đổi theo thời gian, dùng để chỉ đích danh một bản ghi, ví dụ mã khách hàng KH00125 hay mã hàng VT-0457. Trong cơ sở dữ liệu, nó được gọi là khoá chính (primary key). Trong bảng tính văn phòng, nó là cột giúp bạn nối bảng đơn hàng với bảng khách hàng, dò giá từ bảng sản phẩm, và biết chắc hai dòng có nói về cùng một người hay không.
Nhiều văn phòng dùng họ tên hoặc số điện thoại thay cho mã, và chạy được một thời gian. Rồi tới lúc có hai khách cùng tên Nguyễn Thị Lan, một khách đổi số, một nhân viên gõ "Cty" thay vì "Công ty", và mọi phép dò tìm bắt đầu trả sai mà không báo lỗi. Bài này giải thích vì sao cần khoá riêng, cách đặt mã sao cho dùng được nhiều năm, và cách nhờ AI kiểm một bảng xem khoá đã ổn chưa.
Vì sao họ tên không làm khoá được
Khoá phải thoả hai điều kiện: duy nhất và ổn định. Họ tên trượt cả hai. Ở Việt Nam, vài họ chiếm phần lớn dân số và nhiều tên đệm, tên chính rất phổ biến, nên chỉ cần danh sách vài trăm khách là gần như chắc chắn có người trùng tên. Thêm vào đó, cùng một người có thể được ghi là "Trần Văn Hùng", "Tran Van Hung", "A Hùng Thủ Đức" tuỳ người nhập, và máy coi đó là ba người khác nhau.
Số điện thoại tốt hơn nhưng vẫn không đủ. Người ta đổi số, một số dùng chung cho cả gia đình, cửa hàng có một số nhưng nhiều người đến mua, và số có thể được ghi với số 0 đầu, với mã quốc gia hay có dấu chấm ngăn cách. Mã số thuế ổn định hơn với khách là doanh nghiệp, nhưng khách lẻ thì không có hoặc không cung cấp. Số căn cước công dân là thông tin cá nhân nhạy cảm, không nên rải khắp các bảng chỉ để làm khoá.
Vì vậy cách làm phổ biến nhất là tạo một mã riêng, do chính công ty cấp, không mang ý nghĩa gì ngoài việc chỉ đích danh. Dân làm dữ liệu gọi đó là khoá thay thế (surrogate key), để phân biệt với khoá tự nhiên lấy từ thông tin có sẵn như số điện thoại. Họ tên, số điện thoại vẫn được lưu, chỉ là chúng không gánh việc nối bảng nữa.
Các loại khoá hay gặp và chỗ dùng
Bảng dưới gom các khái niệm mà bạn sẽ gặp khi đọc hướng dẫn hoặc khi AI giải thích về cấu trúc bảng.
| Loại khoá | Nghĩa | Ví dụ giả định | Lưu ý |
|---|---|---|---|
| Khoá chính | Cột xác định duy nhất mỗi dòng trong bảng | Mã KH trong bảng Khách hàng | Không trống, không trùng, không sửa sau khi cấp |
| Khoá ngoại | Cột trong bảng này trỏ tới khoá chính của bảng khác | Mã KH trong bảng Đơn hàng | Giá trị phải có thật trong bảng được trỏ tới |
| Khoá tổ hợp | Hai cột trở lên ghép lại mới thành duy nhất | Mã NV cộng Ngày trong bảng chấm công | Từng cột riêng lẻ được phép lặp |
| Khoá tự nhiên | Lấy từ thông tin vốn có của đối tượng | Mã số thuế, số khung xe, mã vạch nhà sản xuất | Có thể đổi hoặc thiếu, cần kiểm trước khi dùng |
| Khoá thay thế | Mã do mình tự cấp, không mang nghĩa | KH00125, SP-0457 | Ổn định nhất cho văn phòng nhỏ |
Bạn không cần nhớ hết tên gọi. Điều cần nhớ là mỗi bảng phải trả lời được câu hỏi "cột nào xác định một dòng", và bảng nào trỏ sang bảng khác thì phải trỏ bằng khoá, không bằng tên.
Đặt mã sao cho dùng được nhiều năm
Có tiền tố theo loại đối tượng. KH cho khách hàng, NCC cho nhà cung cấp, NV cho nhân viên. Nhìn mã là biết thuộc bảng nào, và khi lỡ dán nhầm cột cũng phát hiện ngay.
Độ dài cố định, có số 0 đệm. KH00001 đến KH99999 thay vì KH1, KH25, KH300. Mã cùng độ dài sắp xếp đúng thứ tự cả khi được coi là chữ, và nhìn qua là thấy mã nào gõ thiếu ký tự.
Không nhét thông tin có thể đổi vào mã. Mã kiểu "HN-KH-0125" gắn chi nhánh Hà Nội vào mã khách. Khi khách chuyển sang mua ở chi nhánh Đà Nẵng, hoặc khi công ty sáp nhập chi nhánh, mã trở nên sai nghĩa mà không đổi được vì đã nằm trong hàng nghìn đơn cũ. Chi nhánh là một cột riêng.
Mã hàng có thể mang nghĩa, nhưng phải cố định. Với hàng hoá, nhiều nơi thích mã có cấu trúc như loại, màu, cỡ. Được, miễn là quy tắc ghi thành văn bản và một mã đã cấp thì không bao giờ cấp lại cho mặt hàng khác, kể cả khi mặt hàng cũ đã ngừng bán.
Lưu mã ở dạng chữ. Nếu mã toàn chữ số, như 00125, hãy định dạng cột là văn bản trước khi nhập, nếu không bảng tính sẽ biến thành 125 và mất số 0 đầu. Bài về kiểu dữ liệu trong danh mục này nói kỹ hơn chuyện đó.
Kiểm một bảng xem khoá đã ổn chưa
Trước khi dùng một bảng làm nguồn tra cứu, nên kiểm khoá theo trình tự dưới đây. Mỗi bước làm được bằng công thức có sẵn trong Excel và Google Sheets; AI có thể viết giúp đúng cú pháp cho bảng của bạn.
- Kiểm ô trống. Lọc cột khoá theo ô trống. Dòng không có mã là dòng không ai tham chiếu tới được, phải cấp mã hoặc xoá.
- Kiểm trùng. Thêm cột phụ với công thức đếm số lần mã xuất hiện, ví dụ COUNTIF với vùng là cả cột khoá và điều kiện là ô mã dòng hiện tại. Dòng nào cho kết quả lớn hơn 1 là trùng. Lưu ý máy cài vùng Việt Nam có thể dùng dấu chấm phẩy thay dấu phẩy giữa các đối số.
- Kiểm khoảng trắng và chữ hoa thường. "KH00125" và "KH00125 " (có dấu cách cuối) trông giống nhau nhưng là hai giá trị. Dùng hàm TRIM ở cột phụ rồi so lại. Phần chuẩn hoá chi tiết thuộc danh mục làm sạch dữ liệu.
- Kiểm khoá ngoại. Ở bảng đơn hàng, dò từng Mã KH sang bảng khách hàng bằng XLOOKUP (Excel bản mới, Google Sheets) hoặc VLOOKUP, MATCH ở bản cũ. Mã nào không tìm thấy là đơn "mồ côi", cần truy lại.
- Ghi lại kết quả. Đếm số trống, số trùng, số mồ côi và ghi vào một ô ghi chú kèm ngày kiểm. Lần sau so lại để biết dữ liệu đang tốt lên hay tệ đi.
Nếu nhờ chatbot viết công thức, hãy mô tả bảng bằng tên cột và vị trí cột, không dán danh sách khách thật. Ví dụ: "Bảng Khách hàng ở trang KH, cột A là Mã KH, dữ liệu từ dòng 2 đến 900. Viết công thức ở cột F để đánh dấu mã bị trùng." Sau đó thử công thức trên vài dòng bạn biết chắc là trùng để xem nó có bắt được không.
Khi đã lỡ dùng họ tên làm khoá: chuyển đổi thế nào
Rất nhiều bảng đang chạy dùng tên khách để dò. Chuyển sang mã không cần làm một lần cho mọi thứ, nhưng nên theo thứ tự dưới đây để không làm vỡ các bảng đang dùng.
- Lập bảng Khách hàng riêng nếu chưa có, mỗi khách một dòng, cấp mã theo quy tắc đã chọn. Gặp trường hợp nghi là cùng một người nhưng ghi khác nhau, đánh dấu để người phụ trách quyết, đừng để AI tự gộp.
- Thêm cột Mã KH vào bảng đơn hàng cũ, điền bằng phép dò theo tên. Những dòng dò không ra hoặc dò ra nhiều kết quả, xử lý tay.
- Từ một ngày cụ thể, quy định đơn mới phải nhập Mã KH; tên khách chỉ còn là thông tin hiển thị, tra từ bảng Khách hàng.
- Sửa các công thức dò tìm đang dùng tên chuyển sang dùng mã. Sửa xong kiểm tổng doanh số theo khách trước và sau khi đổi phải bằng nhau, chênh lệch nào cũng phải giải thích được.
- Dùng biểu mẫu hoặc danh sách thả xuống (Data Validation) cho cột Mã KH để người nhập chỉ chọn mã có sẵn, không gõ tự do.
Việc chuyển đổi này tốn công một lần nhưng chấm dứt hẳn loại lỗi "dò ra nhầm khách" vốn rất khó phát hiện. Khi bảng lớn dần và chuyển sang cơ sở dữ liệu thật, khoá đã có sẵn, bước nâng cấp nhẹ hơn nhiều.
Khoá tổ hợp: khi một cột không đủ
Không phải bảng nào cũng có một cột duy nhất làm khoá. Bảng chấm công là ví dụ điển hình: mã nhân viên lặp lại mỗi ngày, ngày lặp lại cho mọi nhân viên, nhưng cặp mã nhân viên và ngày thì chỉ xuất hiện một lần. Tương tự, bảng chi tiết đơn hàng có cặp số đơn và mã hàng, bảng giá theo khu vực có cặp mã hàng và tỉnh.
Với khoá tổ hợp, phép kiểm trùng phải kiểm trên cả cặp. Hàm COUNTIFS với hai điều kiện làm được việc này. Một cách đơn giản khác là tạo cột phụ ghép hai giá trị lại, ví dụ mã nhân viên nối với ngày viết dạng năm-tháng-ngày, rồi kiểm trùng trên cột phụ đó. Cột ghép cũng tiện khi cần dò tìm theo hai điều kiện ở các bản bảng tính cũ.
Một dòng trùng khoá tổ hợp trong bảng chấm công thường có nghĩa là một người được chấm hai lần trong một ngày, do máy chấm công xuất trùng hoặc do hai người cùng nhập tay. Nếu không bắt, ngày công tháng đó sẽ bị cộng dư. Đây là lý do nên chạy kiểm trùng trước mỗi kỳ tính lương, không chỉ một lần khi lập bảng.
Khoá định danh và việc che dữ liệu trước khi đưa vào AI
Một lợi ích ít được nhắc của mã riêng là nó giúp đưa dữ liệu vào AI an toàn hơn. Khi bảng đơn hàng chỉ chứa Mã KH chứ không chứa họ tên, số điện thoại, bạn có thể gửi bảng đó (hoặc một phần) cho chatbot để nhờ phân loại, tìm lỗi nhập, mà không lộ danh tính khách. Bảng nối mã với tên vẫn nằm trong máy công ty.
Cần hiểu đúng giới hạn: mã riêng là bước giảm rủi ro, không phải ẩn danh tuyệt đối. Nếu bảng đi kèm địa chỉ chi tiết, ngày sinh, sản phẩm rất hiếm, người ngoài vẫn có thể suy ra ai là ai. Vì vậy vẫn bỏ những cột không cần cho câu hỏi đang hỏi. Các nguyên tắc về dữ liệu cá nhân và nghĩa vụ pháp lý có trên trang AI Bảo Mật trong cùng hệ; ở đây chỉ dừng ở mức thói quen làm bảng.
Cũng đừng đưa bảng nối mã với tên vào chatbot "cho tiện tra". Đó chính là chìa khoá mở mọi bảng khác. Giữ nó ở nơi phân quyền chặt nhất.
Câu hỏi thường gặp
Có nên dùng số thứ tự dòng làm mã khách hàng không?
Không nên dùng số dòng của bảng tính, vì sắp xếp hay xoá dòng là số đó thay đổi. Có thể dùng số thứ tự tăng dần làm phần số của mã, nhưng phải ghi cố định thành giá trị, không để công thức tự đánh số mỗi lần mở tệp.
Mã khách hàng có nên chứa năm cấp mã không?
Có thể, ví dụ KH26-00125 cho khách tạo năm 2026, vì năm cấp không thay đổi về sau. Nhưng cách này làm mã dài hơn và đôi khi gây hiểu lầm là khách chỉ mua năm đó. Nếu không có nhu cầu rõ ràng, mã đơn giản là đủ.
Hai chi nhánh cùng cấp mã khách thì tránh trùng thế nào?
Cách gọn nhất là chỉ một nơi cấp mã, ví dụ một bảng Khách hàng dùng chung trên Google Sheets có phân quyền. Nếu bắt buộc mỗi chi nhánh tự cấp, chia trước dải số cho từng chi nhánh, nhưng nhớ dải số chỉ để tránh trùng, không dùng nó để suy ra chi nhánh.
Mã vạch in trên bao bì có dùng làm mã hàng được không?
Mã vạch của nhà sản xuất là khoá tự nhiên khá tốt cho hàng đóng gói sẵn. Tuy nhiên hàng tự sản xuất, hàng lẻ cân ký, hàng nhập không mã vạch sẽ không có. Nhiều cửa hàng giữ mã hàng nội bộ làm khoá chính và lưu mã vạch ở một cột riêng.
AI có thể tự gộp các khách bị trùng tên giúp không?
AI có thể gợi ý các cặp nghi trùng dựa trên tên, số điện thoại, địa chỉ gần giống nhau, và việc đó tiết kiệm nhiều thời gian dò. Quyết định gộp nên để người biết khách quyết, vì gộp nhầm hai khách thật sự khác nhau làm sai công nợ và lịch sử mua hàng.