Yabancı anahtarlar - vekil veya doğal anahtar kullanarak bağlantı?


14

Tablolar arasındaki bir yabancı anahtarın doğal bir anahtarla mı yoksa yedek anahtarla mı bağlantılı olacağına dair en iyi uygulama var mı? Gerçekten bulduğum tek tartışma (google-fu'm eksik değilse) Jack Douglas'ın bu sorudaki cevabı ve akıl yürütme bana doğru geliyor. Bu kuralların değişmesinin ötesindeki tartışmanın farkındayım, ancak bu her durumda dikkate alınması gereken bir şey olacaktır.

Sormanın ana nedeni, doğal anahtarlarla FK'lardan yararlanan eski bir uygulamam var, ancak geliştiricilerin OR / M'ye (bizim durumumuzda NHibernate) geçmek için güçlü bir itme var ve bir çatal zaten bazı üretti değişiklikleri kırıyorum, bu yüzden onları doğal anahtarı kullanarak tekrar pistte geri itmek ya da FK için vekil tuşları kullanmak için eski uygulamayı taşımak istiyorum. Bağırsaklar orijinal FK'yi geri yüklemeyi söylüyor, ancak bunun gerçekten takip edilecek doğru yol olup olmadığından emin değilim.

Tablolarımızın çoğunda zaten tanımlanmış bir vekil ve doğal anahtar (benzersiz kısıtlama ve PK olsa da) var, bu yüzden fazladan sütun eklemek zorunda kalmamız bu delilikte bizim için sorun değil. SQL Server 2008 kullanıyoruz, ancak bunun herhangi bir DB için yeterince genel olmasını umarım.

Yanıtlar:


15

Ne SQL ne de ilişkisel model, doğal bir anahtara başvuran yabancı anahtarlar tarafından rahatsız edilmez. Aslında, doğal anahtarlara başvurmak genellikle performansı önemli ölçüde artırır. İhtiyacınız olan bilgilerin doğal bir anahtarda ne sıklıkla yer aldığını görünce şaşıracaksınız; bu anahtarın daha geniş bir tablo için birleşim yaptığı anlamına gelir (ve dolayısıyla bir sayfada depolayabileceğiniz satır sayısını azaltır).

Tanım gereği, ihtiyacınız olan bilgiler her zaman her "arama" tablosunun doğal anahtarında tamamen bulunur. ( Arama tablosu terimi gayrı resmidir. İlişkisel modelde tüm tablolar yalnızca tablolardır. ABD posta kodları tablosunda şuna benzer satırlar olabilir: {AK, Alaska}, {AL, Alabama}, {AZ, Arizona} Çoğu kişi buna bir arama tablosu diyecektir.)

Büyük sistemlerde, birden fazla aday anahtarı olan tablolar bulmak olağandışı değildir. Ayrıca, kuruluşun bir bölümüne hizmet veren tabloların bir aday anahtarına başvurması ve kuruluşun başka bir bölümüne hizmet veren tabloların farklı bir aday anahtarına başvurması olağandışı değildir. Bu ilişkisel modelin güçlü yönlerinden biridir ve SQL'in oldukça iyi desteklediği ilişkisel modelin bir parçasıdır.

Yedek anahtar da içeren tablolarda doğal anahtarlara başvurduğunuzda iki sorunla karşılaşırsınız.

İlk olarak, insanları şaşırtacaksınız. Genellikle En Az Sürpriz İlkesi için güçlü bir şekilde lobi yapmama rağmen, bu şaşırtıcı insanları önemsemediğim bir durum. Sorun, geliştiricilerin yabancı anahtarların mantıksal kullanımı ile şaşırtması durumunda çözüm, yeniden tasarım değil eğitimdir.

İkincisi, ORM'ler genellikle ilişkisel model etrafında tasarlanmamıştır ve bazen en iyi uygulamayı yansıtmayan varsayımları içerirler. (Aslında, genellikle bir veritabanı uzmanından girdi olmadan tasarlanmış gibi görünüyorlar.) Her tabloda bir kimlik numarası gerekli bu varsayımlardan biridir. Bir diğeri, ORM uygulamasının veritabanına "sahip" olduğunu varsaymaktadır. (Bu nedenle tablo ve sütun oluşturmak, bırakmak ve yeniden adlandırmak ücretsizdir.)

30 yıl boyunca en az iki düzine dilde yazılmış yüzlerce uygulama programına veri sunan bir veritabanı sistemi üzerinde çalıştım. Bu veritabanı bir ORM'ye değil işletmeye aittir.

Kırılma değişikliklerine neden olan bir çatal, bir gösteri durdurucu olmalıdır.

Çalıştığım bir şirkette performansı hem doğal anahtarlarla hem de yedek anahtarlarla ölçtüm. Yedek anahtarların doğal anahtarlardan daha iyi performans göstermeye başladığı bir devrilme noktası vardır. ( Bölümleme, kısmi dizinler, işlev tabanlı dizinler, ekstra tablo alanları, katı hal diskleri kullanma vb. Gibi doğal anahtar performansını yüksek tutmak için ek bir çaba varsaymazsak.) Bu şirkete ilişkin tahminlerime göre, Bu arada, doğal anahtarlarla daha iyi performans elde ederler.

İlgili diğer cevaplar: Veritabanı Şemasında Karmaşık


5

Yedek anahtarları desteklememin temel nedeni, doğal anahtarların genellikle değişime tabi olmasıdır ve bu da ilgili tüm tabloların güncellenmesi gerektiği anlamına gelir ve bu da sunucuya oldukça yük bindirebilir.

Ayrıca 30 yıl boyunca birçok konuda çeşitli veritabanları kullanıyorum, gerçek doğal anahtar genellikle oldukça nadirdir. Sözde benzersiz olan şeyler (SSN) değildir, belirli bir zamanda benzersiz olan şeyler daha sonra benzersiz olmayabilir ve e-posta adresleri ve telefon numaraları gibi bazı şeyler benzersiz olabilir, ancak daha sonra farklı insanlar için tekrar kullanılabilir tarihi. Tabii ki bazı şeyler, insanların ve şirketlerin isimleri gibi iyi bir benzersiz tanımlayıcıya sahip değildir.

Doğal bir anahtar kullanarak birleşmelerden kaçınmak. Evet, birleşimlere ihtiyaç duymayan seçme ifadelerini hızlandırabilir, ancak int birleşimleri genellikle daha hızlı olduğu için birleşimlere ihtiyaç duyduğunuz yerlerin daha yavaş olmasına neden olur. Ayrıca, ekleme ve silme işlemlerini yavaşlatacak ve anahtar değiştiğinde güncellemelerde performans sorunlarına neden olacaktır. Karmaşık sorgular (yine de daha yavaş) daha da yavaş olacaktır. Bu nedenle basit sorgular daha hızlıdır, ancak raporlama ve karmaşık sorgular ve veritabanına yönelik birçok eylem daha yavaş olabilir. Bu, veritabanınızın nasıl sorgulandığına bağlı olarak şu veya bu şekilde bahşiş edebilecek bir dengeleme işlemidir.

Yani tek cevap herkese uyan bir cevap yoktur. Veritabanınıza ve nasıl sorgulanacağına ve içinde ne tür bilgilerin depolanacağına bağlıdır. Kendi ortamınızda neyin en iyi olduğunu bulmak için bazı testler yapmanız gerekebilir.


1
“… Doğal anahtarlar genellikle değişime tabidir…” - o zaman çok iyi anahtar değildirler! Bir öznitelik sık sık değişiyorsa, bunu anahtar olarak kullanmayın (elbette "sık sık" çeşitli tanımları için). Fabian Pascal bir anahtar seçmek için dört kriter olduğunu savundu : aşinalık, indirgenemezlik, kararlılık ve basitlik. Bazen bunları yedek anahtarın basitliği için takas edebilirsiniz. HLGEM'in söylediği gibi, "Yani tek tek herkese uyan tek beden yoktur."
Greenstone Walker

1
@GreentoneWalker, o zaman bir anahtar olarak kullanmamalısınız, ancak çoğu zaman dört kritere uyan bir anahtarınız yoktur ve benzersiz olanla gitmek zorundasınız. Ve benzersizlik ortak bir anahtar olduğunda, birleşimlere sahip olmanız gerektiğinde sorun performans açısından daha da büyük olabilir.
HLGEM

-4

Cevabı bilmiyorsanız, Vekil ile devam edin. İşte nedeni - iş kuralları hakkında varsayımlar yapılırsa ve bu varsayımlar yanlışsa veya kurallar değişirse, verileriniz çöptür. İşte bir örnek:

Kişi, Rol, Kişi Rolü

mevcut iş kuralı, Kişinin bir Rolü olduğunu belirtir. PersonRole'u (PersonName, PersonBirthDate, PersonMotherMaidenName, ..., RoleCode) nereye Kişi ve Rolü bağlayan bir tablo oluşturursunuz

Artık Doğal Anahtarlar söz konusu olduğunda gerçek bir saflıktasınız! Ama cidden, org bir kişinin şimdi birden fazla rol üstlenebileceğine karar verirse ne olur? İş ihtiyaçlarındaki değişimi desteklemenin aşağı yönlü etkileri nelerdir?


2
Ve yedek anahtarlarda bu sorunlarınız yok mu? Lütfen bize nasıl olduğunu gösterin.
Colin 't Hart

4
Verilen örnek tartışma ile ilgili bir şey göstermemektedir.
mustaccio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.