Neden int'yi arama tablosunun birincil anahtarı olarak kullanıyorsunuz?


30

Neden int değerini yalnızca birincil anahtarı olarak arama değeri kullanmak yerine (çoğu durumda bir dize olacak) arama tablosunun birincil anahtarı olarak kullanmam gerektiğini bilmek istiyorum.

Bir int yerine bir nvarchar (50) kullanmanın, birçok kayıt içeren bir tabloya bağlanırsa daha fazla alan kullanacağını anlıyorum.

Öte yandan, arama değerini doğrudan kullanmak, temel olarak bizi bir birleşme yaparak kurtarır. Katılmak her zaman gerekliyse, bunun büyük bir tasarruf olacağını hayal edebiliyorum (bir web uygulaması üzerinde çalışıyoruz, bu yüzden biraz sayılır).

"Yapılması gereken standart şey" den başka bir int birincil anahtar kullanmanın (özellikle arama tablosu için) avantajları nelerdir?


4
Bu 2 önceki soruda iyi bilgi ve belki de ihtiyaç duyduğunuz cevabı bulabilirsiniz: Tablonun tüm sütunlarını içeren bir birincil anahtarın bir faydası var mı? ve Karakter vs Tamsayı birincil anahtarlar .
Marian

Yanıtlar:


23

Sorunuzun cevabı, fiziksel değil mantıklıdır; aradığınız değer iş nedeniyle değişebilir. Örneğin, müşterilerinizi e-posta adresine göre endekslerseniz, bir e-posta adresi değiştiğinde ne olur? Açıkçası bu, tüm arama tablolarınıza uygulanmayacak, ancak tüm uygulama boyunca aynı şekilde yapmanın faydaları, kodunuzu daha basit hale getirmesidir. Eğer her şey tamsayıysa → içsel tamsayı içsel olarak ilişkilendiyse, haklısın.

Sadece Sandy'ye yorumunuzu okuyun - belki de bu durumda gerçekten istediğiniz şey bir Çek Kısıtlamasıdır , yabancı anahtar / arama tablosu değil, örneğin:

create table icecream (flavour varchar(10))
go
alter table icecream add constraint ck_flavour check (flavour in ('Orange', 'Pista', 'Mango'))
go
insert into icecream (flavour) values ('Orange')
go
insert into icecream (flavour) values ('Vanilla')
go

Bunu çalıştır ve anlarsın:

(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_flavour". The conflict occurred in database "GAIUSDB", table "dbo.icecream", column 'flavour'.
The statement has been terminated.

Bu verimli, yüksek performanslı bir yöntemdir, ancak elbette dezavantajı, yeni bir lezzet eklemenin kod değişikliği anlamına gelmesidir. Uygulamada bunu yapmamaya karşı tavsiyede bulunacağım - o zaman bu DB'ye bağlanan her uygulamada yapmanız gerektiğinden, mümkün olan en temiz tasarımdır çünkü doğrulama için sadece tek bir kod yolu vardır.


@ Gaius- İyi bir örnek ... Bu senaryo için Kontrol Kısıtlamasını kullanmamayı tercih ediyorum; sürdürülmemesinin temel nedeni (onu dezavantaj olarak gösterdiniz).
CoderHawk

1
@Sandy Gerçekten verilere, ne sıklıkta değişeceğine ve başka nerede kullanılacağına bağlıdır. Örneğin, kısıtlamanın DB tarafından uygulanması gerekiyorsa, ancak değerler bir açılır menüyü doldurmak için veya bir raporda kullanılabilirse, bir yabancı anahtar daha uygun olur. Her iki durumda da, uygulamada yapmamaya karşı tavsiye ediyorum.
Gaius

7

“Doğrudan arama değerini kullanma” - bit, arama tablosunun asıl amacı ile çelişkilidir. Neden böyle bir masa tutuyorsun? Bir arama değilse.
Belki sorunuzu yanlış anlamış olabilirim. İşte msdn'den bir arama tablosu tanımı

Bir arama tablosu, bir tabloda bir yabancı anahtarın değerini başka bir tabloda bulunan değeri temel alarak bir tabloda bilgi görüntülemek için kullanılır. Örneğin, bir satış veritabanındaki Siparişler tablosunu göz önünde bulundurun. Siparişler tablosundaki her kayıt, hangi müşterinin sipariş verdiğini belirten bir Müşteri Kimliği içerir. MüşteriNo, Müşteriler tablosundaki bir müşteri kaydına işaret eden yabancı bir anahtardır. Bir Siparişler listesi sunarken (Siparişler tablosundan), müşteri adının aksine gerçek müşteri adını görüntülemek isteyebilirsiniz. Müşterilerin adı müşteriler tablosunda olduğundan ve Siparişler tablosundan veri sunuyorsanız, Siparişler kaydında Müşteri Kimliği değerini alan ve bu değeri ilişkide gezinmek ve geri dönmek için bu değeri kullanan bir arama tablosu oluşturmanız gerekir. okunabilir, müşteri ismi.

Arama tablonuzun amacını açıklayabilir misiniz? Aşağıdaki gibi bazı statik verileri depolamak için kullanılıyor mu ve bu kayıtlar diğer tablo kayıtlarının bir girişi değil mi?

Lezzet tablosu

Orange  
Pista  
Mango

Yukarıdaki sizin durumunuz ise, o zaman arama tablosunu kullanmamanızı tavsiye ederim; Web listenizde bu liste değerlerini büyük olasılıkla yazınız. Bu şekilde gereksiz veritabanı sorgulamasını önleyebilirsiniz.


1
iyi bir nokta, arama tablomun amacı, temel olarak sadece bir sütunun yabancı anahtar kısıtlaması yoluyla sahip olabileceği farklı değerleri uygulamaktır. Bunu uygulamaya kodlamanın kodlamanın bununla başa çıkmanın başka bir yolu olabileceğini kabul ediyorum.
Jaco Briers,

@Jaco Briers - Gaius'un cevabına bakınız ... Kısıtlamayı Kontrol Et ...
CoderHawk

7

Sorunuzu 'özellikle bir arama tablosu için' ile nitelendirdiğiniz için, cevap muhtemelen 'yerden tasarruf' şeklinde basitleştirilmiştir.

Bence bu niteleyiciyi kaldırırsanız, sorunuz şu şekilde olur: 'Neden doğal anahtarlar üzerinde yedek anahtarlar kullanıyorsunuz?' ' yazdımVekil tuşları desteklemek için aşağıdakileri :

"Daha geniş bir bileşik anahtar yerine bir tamsayı değerinin geçirilmesinin sayısız yararı vardır. Fiziksel model boyunca hoş bir tutarlılık sağlar ve büyük ölçüde maliyetinden daha fazla yer tasarrufu sağlar ve özellikle bileşik anahtarlara geçiş yaparken G / Ç'yi düşürür; normalleştirilmiş model. Ayrıca, bir modelin anlaşılmasını ve sorgu bağlantılarının birleştirilmesini kolaylaştırıyor. "

Bu, büyük ölçüde “yapılması gereken standart şey haline geldi”. Talihsiz iki ürün, insanların bir vekil anahtarına atmaları ve aday anahtarların ne olduğunu düşünmemeleridir ... Ama şimdi sorunuzun dışına çıkıyoruz :)


3

Her zaman kullanmamın nedenlerinden biri, bir kişinin arama tablosunda bir değeri yanlış yazması durumunda, Portakal yerine Oraneg demek, arama tablosundaki değeri değiştirmenin çok kolay olmasıdır.

Bir numaralı birincil anahtar içeren arama tablosu, sadece arama tablosunda değiştirilecek değere ihtiyaç duyar.

Değerleri birincil anahtar olarak kullanan arama tablosu, arama tablosunda ve kullanıldığı ana tabloda bulunan her kayıtta değiştirilmelidir.


2

Kimlik tanımladığınızda, benzersizliği de garanti edebilirsiniz. Ancak, örneğin e-postaları benzersiz bir tanımlayıcı olarak aldığınızda, benzersizliğin sorumluluğunu güvenilmeyen 3. tarafa taşırsınız.

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.