Thuộc tính nào có sẵn cho bạn? Ứng dụng của bạn quan tâm đến ứng dụng nào? Ví dụ, không có hai người có thể được sinh ra tại chính xác cùng một giây tại cùng một vị trí chính xác, nhưng bạn có thể không có quyền truy cập vào dữ liệu đó ở mức độ chính xác đó! Vì vậy, bạn cần phải quyết định, từ các thuộc tính mà bạn dự định mô hình hóa, cái nào là đủ để cung cấp mức độ toàn vẹn dữ liệu có thể chấp nhận được. Bất cứ điều gì bạn chọn, bạn phải tập trung vào các khía cạnh toàn vẹn dữ liệu (ngăn chặn chèn nhiều hàng cho cùng một người) của lựa chọn của bạn.
Để tham gia/Khóa ngoại trong các bảng khác, tốt nhất nên sử dụng khóa thay thế.
Tôi đã phát triển để xem xét việc sử dụng từ Khoá chính làm từ khóa sai hoặc tốt nhất, gây nhầm lẫn. Phím bất kỳ, cho dù bạn cờ nó như Primary Key, thay thế chính, Unique chính, hoặc Index Unique, vẫn là một Key, và yêu cầu mọi hàng trong bảng chứa các giá trị duy nhất cho các thuộc tính trong Chìa khóa. Theo nghĩa đó, tất cả các phím đều tương đương nhau. Điều quan trọng hơn (Hầu hết), là liệu chúng có phải là khóa tự nhiên (phụ thuộc vào thuộc tính dữ liệu mô hình miền thực) hay thay thế (Độc lập của thuộc tính dữ liệu thực)
Thứ hai, điều gì cũng quan trọng là bạn sử dụng khóa Các khóa thay thế là hẹp và đơn giản và không bao giờ thay đổi (Không có lý do gì - chúng không có ý nghĩa gì cả) Vì vậy, chúng là một lựa chọn tốt hơn cho việc tham gia hoặc cho các khóa ngoài trong các bảng phụ thuộc khác.
Nhưng để đảm bảo tính toàn vẹn dữ liệu và ngăn chèn nhiều hàng cho cùng một thực thể tên miền, chúng hoàn toàn vô dụng ... Vì bạn cần một số loại khóa tự nhiên, được chọn từ dữ liệu bạn có sẵn và mà ứng dụng của bạn đang lập mô hình cho một số mục đích.
Khóa không phải là 100% không thay đổi. Nếu (ví dụ), bạn sử dụng Tên và Số điện thoại và Ngày sinh, ví dụ, ngay cả khi một người thay đổi tên của họ hoặc số điện thoại của họ, bạn có thể chỉ cần thay đổi giá trị trong bảng. Miễn là không có hàng nào khác đã có các giá trị mới trong thuộc tính khóa của chúng, bạn vẫn ổn.
Ngay cả khi khóa bạn chọn chỉ hoạt động trong 99,9% trường hợp, (giả sử bạn đủ may mắn để chạy vào hai người có cùng tên và số điện thoại và được sinh ngẫu nhiên cùng ngày), ít nhất, ít nhất 99,9% dữ liệu của bạn sẽ được đảm bảo chính xác và nhất quán - và bạn có thể làm ví dụ, chỉ cần thêm thời gian vào ngày sinh của họ để làm cho chúng độc đáo hoặc thêm một số thuộc tính khác vào khóa để từ bỏ chúng. Miễn là bạn không phải cập nhật các giá trị dữ liệu trong Khóa Ngoại trong toàn bộ cơ sở dữ liệu của bạn do thay đổi, (vì bạn không sử dụng khóa này làm FK ở nơi khác), bạn không gặp phải bất kỳ vấn đề nào đáng kể.
Trong Oracle PL/SQL cung cấp cho bạn khả năng duy trì mức độ độc đáo của cơ sở dữ liệu vì bạn có thể viết mã sql để thao tác logic nghiệp vụ. Trong thực tế tất cả các phương ngữ T-SQL khác cung cấp cho bạn sức mạnh đó theo như tôi biết. Tuy nhiên đây không phải là hành vi tiêu chuẩn cho tất cả các động cơ sql. Tính duy nhất có vẻ là một vấn đề logic kinh doanh trong các yêu cầu của bạn. Vì vậy, đi cho nó trong ứng dụng. – user114285