Theo tôi hiểu, về cơ bản, hình thức bình thường thứ ba (3NF) có nghĩa là phải có chính xác một khóa.
Số 2NF, 3NF và Boyce Codd Form Form (BCNF) xử lý các phụ thuộc chức năng . Bảng trong 2NF có nghĩa là không có phụ thuộc khóa một phần trong đó cột không khóa phụ thuộc vào một số tập hợp con chính xác của khóa nhiều cột. Các bảng như bảng trong ví dụ của chúng tôi đã có trong 2NF vì mỗi khóa ứng cử viên là một cột duy nhất. Một bảng trong 3NF có nghĩa là mọi cột không khóa cũng không phụ thuộc chức năng vào một số cột không khóa khác và do đó tạo ra một phụ thuộc bắc cầu. Không có vấn đề gì nếu có một hoặc một trăm khóa ứng cử viên. Trên thực tế, đó là BCNF, không phải 3NF, đây là hình thức bình thường "cuối cùng" liên quan đến các phụ thuộc chức năng. Điều này là do một bảng có thể ở 3NF nhưng không có trong BCNF vì có thể có nhiều khóa ứng viên trùng nhau. Do đó, khi chúng tôi sử dụng thuật ngữ 3NF có nghĩa là "hoàn toàn bình thường hóa" đối với các phụ thuộc chức năng, điều chúng tôi thực sự muốn nói là BCNF.
Nếu một bảng có cột id tự động tăng cũng có một cột được biết là duy nhất và không null, ví dụ số an sinh xã hội, thì cột khác này có thể được sử dụng làm khóa.
Không chỉ có thể, nó phải là nếu chúng ta muốn đảm bảo dữ liệu được lưu trữ trong cơ sở dữ liệu vẫn phù hợp với các quy tắc chúng ta đã xác định trong thế giới thực!
Bỏ qua các vấn đề thực tế / kinh doanh (ví dụ rủi ro về sinh thái / quyền riêng tư khi chuyển qua SSN làm khóa / FK), từ khía cạnh thiết kế lược đồ nghiêm ngặt, liệu một bảng như vậy có nằm trong 3NF không vì có 2 khóa hiệu quả?
Như đã giải thích ở trên, bảng có trong 3NF hay không (hay quan trọng hơn là BCNF) là trực giao với số lượng khóa ứng viên mà nó chứa.
Câu trả lời có khác nhau về việc liệu có một khóa duy nhất trên cột kia không? Nếu vậy, tại sao?
Không, đơn giản là vì việc xác định bảng có hay không trong 3NF không liên quan gì đến việc có bao nhiêu khóa ứng cử viên. Thay vào đó, mọi thứ phải làm với việc đảm bảo tất cả các cột không khóa phụ thuộc hoàn toàn vào chức năng của các khóa ứng cử viên đó.
Nhưng điều này không mang đến một điểm thú vị. Lưu ý rằng một khóa duy nhất khi được định nghĩa là một ràng buộc trong DBMS không giống như một mã định danh duy nhất được xác định là quy tắc kinh doanh trong mô hình kinh doanh khái niệm. Có lẽ trong thế giới của chúng ta, chúng ta luôn biết SSN của người đó và do đó, nó đóng vai trò là khóa ứng cử viên cho một người và có lẽ chúng ta cũng giới thiệu khóa thay thế trong lược đồ logic mà chúng ta gọi là Id người . Mô hình kinh doanh của chúng tôi bao gồm quy tắc nêu rõ SSN là định danh duy nhất cho một người trong thế giới của chúng tôi. Điều này ngụ ý một sự phụ thuộc chức năngcủa tất cả các thuộc tính mô tả về thuộc tính nhận dạng này. Quy tắc này không thay đổi chỉ vì chúng tôi quên hoặc chọn không thông báo cho DBMS. Đây chính xác là lý do tại sao điều quan trọng là khai báo ràng buộc - để DBMS có thể đảm bảo dữ liệu được lưu trữ phù hợp với các quy tắc của mô hình kinh doanh! Nếu chúng ta không tạo ra ràng buộc duy nhất đó đối với SSN, thì bây giờ chúng ta có thể vô tình tạo nhiều hơn một hàng cho cùng một người có cùng SSN; mỗi hàng có Id người khác nhau!
Một mồi tuyệt vời về các chủ đề này là Chuỗi cơ sở dữ liệu thực tế của Fabian Pascal và Lý thuyết quan hệ và thiết kế cơ sở dữ liệu của Chris Date , từ đó câu trả lời này được rút ra. Mặc dù mỗi bài viết của Fabian là phải đọc, bài số 1 (trong đó xác định rõ sự khác biệt giữa các mức độ khái niệm, logic và vật lý) và bài số 4 (trong đó xác định rõ các loại khóa khác nhau) giải quyết cụ thể câu hỏi này. Tương tự như vậy, toàn bộ cuốn sách của Chris là phải đọc trong khi Phần II là phần dành cho bình thường hóa đối với sự phụ thuộc chức năng.