Burada çok fazla travma var. Aslında string string'leri sıkça kullanıyorum, fakat çoğu zaman birleşim için yedek ikincil anahtarları da ekliyorum (tabii ki MySQL kullanıyor olsaydım bunun tersi olur). Ancak yapmadığım durumlar var.
Öncelikle db'nin bu durumu iyi idare edebileceği doğal anahtarlar olarak birincil anahtar olarak beyan etmenin hayranıyım (örneğin PostgreSQL). Bu normalleşmeye yardımcı olur ve daha net veritabanı tasarımı sağlar. Vekil tuşlar katılmayı kolaylaştırır.
Genellikle vekil anahtarlar eklememin iki nedeni var:
Doğal bir anahtarın ne olduğu her zaman net değildir. Bazen bunlar değişmeli. Birleştirme ve referans bütünlüğü için kullanıldığında doğal, bileşik bir anahtarı değiştirmek karmaşıktır ve hataya açıktır.
Kompozit anahtarlarda birleştirme performansı sorunludur ve bir kez doğal anahtar yolundan aşağıya indiğinizde, burada sıkışıp kalırsınız.
Doğal anahtarın tanımlayıcı olduğu durumlarda, tek sütun ve metin, ancak genellikle dize anahtarına katılırım. Bunu yapmamın nedeni, bunun genellikle araştırmaya katılmaktan kaçınmasıdır. En yaygın kullanım, enum tiplerinin kullanım durumlarında uygun db tasarımı sağlamaktır. Çoğu durumda, bu do not ekstra rutin sorguları için katılmak gerektirir. Öyleyse, bu durumda, birleştirme tuşları gibi dize tuşları mükemmel anlamlıdır.
Örneğin, LedgerSMB'de hesap kategorilerini saklıyoruz. Bunlar string referansı ile tanımlanır ve bazı diğer veriler bir hesabı etkileyebilecek kategorizasyonların kombinasyonları ile ilgili kuralları uygulamak için kullanılan string referansı ile birlikte saklanır. Mantığa ihtiyaç duyulan tek zaman, bir grup kategoriyi kaydederken, dize anahtarına katılıyoruz.
Neden varsayılanın tamsayı anahtarları olacağı konusunda, bunun sadece indeks büyüklüğünde bir soru olduğunu sanmıyorum. Önemli bir konu, anahtarların yönetimidir. Anahtar rastgele olduğundan ve milyonlarca kayıtla başa çıkabildiğiniz için, benzersiz karakter dizileri oluşturmanın bir yolunu bulmanız gerekir. İnsanların bunun için UUID kullandığı durumlar var, ancak sıfır olmayan bir UUID çarpışma olasılığı var ve milyarlarca kaydın saklandığı yerlerde, bu şans artmış tamsayı tipleriyle çarpışma şansı sıfırken gerçekten görülebilecek kadar yüksek hale geliyor tanım olarak.