Evet, kesinlikle Birincil Anahtar için sayısal bir tür yerine bir dize kullanmanın olumsuz sonuçları vardır ve dahası, bu PK Kümelenmişse (gerçekten sizin durumunuzda). Ancak, bir dize alanı kullanmanın etkilerini görme derecesi a) bu tabloda kaç satır olduğu ve b) diğer tablolardaki kaç satırın bu PK'ye Yabancı Anahtarlı olduğu işlevidir. Bu tabloda yalnızca 10k satırınız ve bu tablo aracılığıyla FK'nin bu tabloya göre koyduğu diğer birkaç tabloda 100k satırınız varsa, belki de bu kadar fark edilmeyecektir. Ancak satır sayısı arttıkça bu etkiler kesinlikle daha belirgin hale gelir.
Kümelenmiş bir Dizindeki alanların Kümelenmemiş Dizinlere aktarıldığını düşünmeniz gerekir. Yani sadece satır başına 40 bayta değil, (40 * bazı_sayılı) bayta da bakıyorsunuz. Ve herhangi bir FK tablosunda, satırda aynı 40 bayt var artı daha sık olarak JOIN'lerde kullanıldığı gibi bu alanda Kümelenmemiş bir dizin olacak, bu yüzden FK'nin herhangi bir tabloda gerçekten iki katına çıkacak. Bu. Biri 40 bayt * 1 milyon satır * 10 kopyasının endişelenecek bir şey olmadığını düşünmeye eğilimliyse, lütfen Disk Ucuzdur makalemi görün ! ORLY? bu karardan etkilenen alanların tümünü (veya en azından çoğunu) ayrıntılı olarak açıklar.
Dikkate almak başka bir şey filtreleme ve ikili Harmanlama (Ben genellikle küçük harfe duyarlı değildir veritabanı varsayılan kullandığınız varsayılmaktadır) kullanmayan özellikle iplerin üzerinde tasnif kullanırken daha (yani uzun sürer) çok daha az verimli olmasıdır INT
/ BIGINT
. Bu, bu alana filtre uygulayan / birleştiren / sıralayan tüm sorguları etkiler.
Bu nedenle, CHAR(5)
Kümelenmiş bir PK için benzer bir şey kullanmak muhtemelen iyi olurdu, ancak çoğunlukla da COLLATE Latin1_General_100_BIN2
(veya bunun gibi bir şeyle) tanımlanmışsa.
Ve değeri [CODE]
hiç değişebilir mi? Cevabınız evet ise, onu PK olarak kullanmamanız için daha fazla sebep vardır (FK'leri ayarlamış olsanız bile ON UPDATE CASCADE
). Eğer bunu değiştiremez veya hiç değiştirmeyecekse bu iyidir, ama yine de Kümelenmiş PK olarak kullanmamak için yeterli neden vardır.
Tabii ki, soru şu anda PK'nizde zaten bu alana sahip gibi göründüğü için yanlış ifade edilmiş olabilir.
Ne olursa olsun, en iyi seçeneğiniz, [ID_CODE]
Kümelenmiş PK olarak kullanmak, bu alanı FK olarak ilgili tablolarda kullanmak ve [CODE]
bir UNIQUE INDEX
(alternatif olarak "alternatif anahtar" olduğu anlamına gelir) olarak kullanmaktır.
Güncelleme
Bu yanıta yapılan bir yorumda bu soruya dayalı biraz daha bilgi:
[ID_CODE], PRIMARY KEY olarak, tabloya bakmak için [CODE] sütununu kullanırsam en iyi seçenek midir?
Bu, bazıları daha önce bahsettiğim, ancak yeniden ifade edeceğim birçok faktöre bağlıdır:
Birincil Anahtar, herhangi bir Yabancı Anahtar tarafından başvurulsun veya edilmesin, ayrı satırın nasıl tanımlandığıdır. Sisteminizin satırı dahili olarak nasıl tanımladığı, kullanıcılarınızın kendilerini / o satırı nasıl tanımladığı ile aynı olmak zorunda değildir. Benzersiz veri ile herhangi bir NOT NULL sütun olabilir çalışır, ancak PK, özellikle, aslında, herhangi FKS tarafından başvurulan, dikkate pratiklik sorunları vardır. Örneğin GUID'ler benzersizdir ve bazı insanlar bunları çeşitli nedenlerle kullanmayı gerçekten severler, ancak Kümelenmiş Dizinler için oldukça kötüdürler ( NEWSEQUENTIALID
daha iyidir, ancak mükemmel değildir). Öte yandan, GUID'ler alternatif anahtarlar kadar iyidir ve uygulama tarafından satırı aramak için kullanılır, ancak JOIN'ler hala bir INT (veya benzeri) PK kullanılarak yapılır.
Şimdiye kadar bize [CODE]
alanın sisteme tüm açılardan nasıl uyduğunu söylemediniz , şu andan itibaren satırlara nasıl baktığınızdan bahsediyorsunuz, ancak bu tüm sorgular için mi yoksa sadece bazıları için mi? Dolayısıyla:
Bu karar sadece "NVARCHAR evet mi hayır mı?" Genel olarak konuşmanın iyi bir fikir olduğunu bulamadığımı tekrar söyleyeceğim, ama kesinlikle iyi olduğu zamanlar var. Bu tablodaki çok az alan göz önüne alındığında, daha fazla veya en azından çok fazla dizin olması olası değildir. Bu nedenle [CODE]
, Kümelenmiş Dizin olarak her iki şekilde de iyi olabilirsiniz . Ve başka hiçbir tablo bu tabloya gönderme yapmıyorsa, PK yapmak iyi olabilir. Ancak, diğer tablolar bu tabloya başvuruyorsa, o zaman [ID_CODE]
Kümelenmemiş olsa bile alanı PK olarak seçerdim.