Sanırım ihtiyaç çok güçlü bir kelime ve katı bir anlamda, tabloların muhtemelen yedek anahtarlara ihtiyacı yoktur .
Ancak, veritabanım olsaydı, muhtemelen yedek anahtarları eklerdim. Veritabanı tasarımımın, standartlarının ne kadar kararlı olduğuna bakılmaksızın, bir grup üçüncü tarafa (IATA, ISO) bağlı olmasını istemeyebilirim. Veya, belirli bir standarda hiç bağlı kalmak istemeyebilirim (başka para birimi kodu standartları var mı? Bilmiyorum). Muhtemelen benim gibi vekil anahtarları ile tablolarım model:
+-------------------------+ +------------------------+
|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 |
+-------------------------+
Diğer bir deyişle, bu endüstri standardı kodları benim başvurumda doğal olarak önemli olmadıkça , bunları tablolarımın PK'si olarak kullanmam. Onlar sadece etiketler. Diğer tablolarımın çoğunda zaten yedek anahtarlar olacak ve bu kurulum veri modelime tutarlılık katacaktır. Yedek anahtarları 'ekleme' maliyeti minimumdur.
Bazı yorumlara göre güncelleme:
Örnek tabloların bağlamını bilmeden, IATA Havaalanı Kodları gibi şeylerin veritabanını kullanarak uygulamaya ne kadar önemli olduğunu bilmek imkansızdır. Açıkçası, IATA kodları uygulama için merkezi olarak önemliyse ve yaygın olarak kullanılıyorsa, uygun analizden sonra kodları tablonun PK'si olarak kullanmak doğru karar olabilir.
Ancak, tablo yalnızca uygulamanın birkaç köşesinde kullanılan bir arama tablosu ise, IATA kodlarının göreceli önemi veritabanı altyapısında bu kadar önemli bir noktayı haklı göstermeyebilir. Elbette, burada ve orada birkaç sorguda ek birleştirme yapmanız gerekebilir, ancak bu çaba, IATA kodlarını yapma birincil anahtar alanı. Bazı durumlarda, sadece umurumda değil, aynı zamanda IATA kodları ile ilgilenmek de istemiyorum . @James Snell'in aşağıdaki yorumu, tablolarımın PK'sini etkilemek konusunda endişelenmek istemeyeceğim bir şeyin mükemmel bir örneğidir.
Ayrıca, tasarımda tutarlılık önemlidir. Tamamı tutarlı şekilde tasarlanmış yedek anahtarlar içeren düzinelerce tablo içeren bir veritabanınız ve ardından PK olarak üçüncü taraf kodlarını kullanan ve tutarsızlık getiren birkaç arama tablosu varsa. Bu tamamen kötü değil, ancak belgeleme ve garanti edilmeyebilecek ekstra dikkat gerektirir. Onlar iyilik uğruna arama tabloları , sadece tutarlılık için bir vekil anahtar kullanmak mükemmel para cezası.
Daha fazla araştırmaya dayalı güncelleme:
Tamam, merak beni ısırdı ve ben soruda verilen bağlantılardan başlayarak eğlence için IATA havaalanı kodları üzerinde biraz araştırma yapmaya karar verdim.
Anlaşıldığı üzere, IATA kodları, soru ortaya çıktığı kadar evrensel ve otoriter değildir. Bu sayfaya göre :
Çoğu ülke resmi havacılık yayınlarında IATA kodları yerine dört karakterli ICAO kodları kullanır .
Ayrıca, IATA kodları ve ICAO kodları, hava alanlarını tanımlamanın başka bir yolu olan FAA Tanımlayıcı kodlarından farklıdır .
Bunları ortaya çıkarmamdaki amacım, hangi kodların daha iyi veya daha evrensel veya daha yetkili veya daha kapsamlı olduğu hakkında bir tartışma başlatmak değil, veritabanı yapınızı neden rastgele bir 3. taraf tanımlayıcı etrafında tasarlamanın tam olarak yapmayı tercih ettiğim bir şey olmadığını göstermek. , bunun için belirli bir iş nedeni olmadıkça .
Bu durumda, veritabanımın birincil anahtar adayı olarak IATA kodlarını (veya herhangi bir üçüncü taraf, potansiyel olarak değiştirilebilir kodu) geçirerek ve yedek anahtar kullanarak daha iyi yapılandırılmış, daha kararlı ve daha esnek olacağını hissediyorum . Bunu yaparak, birincil anahtar seçimi nedeniyle ortaya çıkabilecek potansiyel tuzaklardan vazgeçebilirim.