Tôi nghĩ rằng nhu cầu là một từ rất mạnh mẽ và theo một nghĩa nghiêm ngặt, các bảng có thể không cần khóa thay thế .
Tuy nhiên, nếu đó là cơ sở dữ liệu của tôi, tôi có thể sẽ thêm khóa thay thế. Tôi có thể không nhất thiết muốn thiết kế cơ sở dữ liệu của mình phụ thuộc vào một nhóm các bên thứ ba (IATA, ISO), bất kể tiêu chuẩn của họ ổn định đến mức nào. Hoặc, tôi có thể không muốn phụ thuộc vào một tiêu chuẩn cụ thể nào cả (có tiêu chuẩn mã tiền tệ nào khác không? Tôi không biết). Tôi có thể mô hình hóa các bảng của mình với các khóa thay thế như vậy:
+-------------------------+ +------------------------+
|Airport | |Country |
|-------------------------| |------------------------|
|airport_id int (PK)| |country_id int (PK) |
|iata_airport_code string | |iso_country_code string |
|icao_airport_code string | +------------------------+
|faa_identifier string |
|address string |
|name string |
+-------------------------+
+-------------------------+
|Currency |
|-------------------------|
|currency_id int (PK) |
|iso_currency_code string |
|name string |
+-------------------------+
Nói cách khác, trừ khi các mã tiêu chuẩn công nghiệp đó vốn đã quan trọng đối với ứng dụng của tôi, tôi sẽ không sử dụng chúng làm PK trong các bảng của mình. Chúng chỉ là nhãn hiệu. Hầu hết các bảng khác của tôi có thể sẽ có các khóa thay thế và thiết lập này sẽ thêm tính nhất quán cho mô hình dữ liệu của tôi. Chi phí 'thêm' các khóa thay thế là tối thiểu.
Cập nhật dựa trên một số ý kiến:
Không biết ngữ cảnh của các bảng ví dụ, không thể biết những điều quan trọng như Mã sân bay IATA đối với ứng dụng sử dụng cơ sở dữ liệu như thế nào. Rõ ràng, nếu các mã IATA là trọng tâm tập trung và được sử dụng phổ biến trong toàn bộ ứng dụng, thì đó có thể là quyết định chính xác, sau khi phân tích chính xác, sử dụng mã làm PK của bảng.
Tuy nhiên, nếu bảng chỉ là bảng tra cứu được sử dụng ở một vài góc của ứng dụng, tầm quan trọng tương đối của mã IATA có thể không chứng minh được vị trí nổi bật như vậy trong cơ sở hạ tầng cơ sở dữ liệu. Chắc chắn, bạn có thể phải tham gia thêm vào một vài truy vấn ở đây và đó, nhưng nỗ lực đó có thể là tầm thường so với nỗ lực cần có để thực hiện nghiên cứu để đảm bảo rằng bạn hiểu đầy đủ ý nghĩa của việc tạo mã IATA trường khóa chính. Trong một số trường hợp, không chỉ tôi không quan tâm, mà tôi không muốn phải quan tâm đến mã IATA. @James Nhận xét của Snell dưới đây là một ví dụ hoàn hảo về điều mà tôi có thể không muốn phải lo lắng về việc ảnh hưởng đến PK của các bảng của mình.
Ngoài ra, tính nhất quán trong thiết kế là quan trọng. Nếu bạn có một cơ sở dữ liệu với hàng tá bảng, tất cả đều được thiết kế khóa thay thế một cách nhất quán, và sau đó một vài bảng tra cứu đang sử dụng mã của bên thứ 3 dưới dạng PK, điều đó đưa ra sự không nhất quán. Điều đó không hoàn toàn xấu, nhưng nó đòi hỏi sự chú ý thêm trong tài liệu và những thứ đó có thể không được bảo hành. Chúng là các bảng tra cứu vì lợi ích, chỉ cần sử dụng khóa thay thế cho tính nhất quán là hoàn toàn tốt.
Cập nhật dựa trên nghiên cứu thêm:
Ok, sự tò mò cắn tôi và tôi quyết định thực hiện một số nghiên cứu về mã sân bay IATA cho vui, bắt đầu với các liên kết được cung cấp trong câu hỏi.
Hóa ra, các mã IATA không phổ biến và có thẩm quyền như câu hỏi khiến chúng trở thành hiện thực. Theo trang này :
Hầu hết các quốc gia sử dụng mã ICAO bốn ký tự , không phải mã IATA, trong các ấn phẩm hàng không chính thức của họ.
Ngoài ra, mã IATA và mã ICAO khác với mã Định danh FAA , đây là một cách khác để xác định sân bay.
Quan điểm của tôi khi đưa ra những vấn đề này không phải là bắt đầu một cuộc tranh luận về việc mã nào tốt hơn hay phổ quát hơn hay toàn diện hơn hay toàn diện hơn, nhưng để chỉ ra chính xác lý do tại sao thiết kế cấu trúc cơ sở dữ liệu của bạn xung quanh một định danh bên thứ 3 tùy ý không phải là điều tôi sẽ chọn làm , trừ khi có một lý do kinh doanh cụ thể để làm như vậy .
Trong trường hợp này, tôi cảm thấy cơ sở dữ liệu của mình sẽ có cấu trúc tốt hơn, ổn định hơn và linh hoạt hơn, bằng cách gửi mã IATA (hoặc bất kỳ bên thứ 3 nào, mã có khả năng thay đổi) làm ứng cử viên khóa chính và sử dụng khóa thay thế. Bằng cách làm như vậy, tôi có thể từ bỏ bất kỳ cạm bẫy tiềm năng nào có thể mọc lên do lựa chọn khóa chính.