E-posta adresi benzersiz mi yoksa birincil anahtar mı?


11

Ben veritabanlarında bir acemi. Etrafımda okudum ve muhtemelen e-posta adresini birincil anahtar olarak kullanmanın harika bir fikir olmadığını öğrendim çünkü dize karşılaştırmaları karmaşık birleştirmelerdeki performansı etkileyen daha yavaş ve bir e-posta değiştiğinde çok fazla yabancı anahtar değiştirme çaba.

Ancak kullanıcı tablom her kullanıcının bir e-posta adresine sahip olmasını gerektiriyorsa ve bu e-posta adreslerinin her birinin benzersiz olması gerekiyorsa, e-posta sütununa benzersiz bir dizin eklemek yeterli olur mu? Afaik benzersiz alanları boş değerlere izin verdiğinden, her kullanıcının boş değerlere izin vermemesi için bir e-posta adresine sahip olmasını isterim. Burada özlediğim bir şey var mı? Ya da e-posta sütununu benzersiz yapmayı ve sunucudaki veri doğrulaması sırasında her kullanıcının bir e-posta adresi girmesini sağladığından emin olun.


3
Bir kullanıcı e-posta adresini değiştirdiğinde ne olur - örneğin işi değiştirir gibi
user151019

1
Dize karşılaştırmaları sadece daha yavaş değildir, dizeler de bir tamsayıdır, dolayısıyla bellekteki bir sayfaya daha az sığabilir, böylece sorgular için mantıksal okumalarınızı yükseltebilirsiniz.
İsimsiz Bir

Yanıtlar:


7

Önce anahtarlar ve dizinler arasında ayrım yapalım, anahtar mantıksal modelin bir parçasıdır ve genellikle benzersiz bir dizinle uygulanır. Ancak, bir anahtar oluşturmadan benzersiz bir dizin oluşturabilirsiniz, ancak buna yabancı bir anahtar tarafından başvuru yapılamaz.

Aday anahtarı, tablodaki bir satırı benzersiz bir şekilde tanımlayan bir şeydir, SQL'de aday anahtarlardan biri normalde birincil anahtar olarak kullanılır (ck'den birinin neden diğerlerinden daha iyi "olarak değerlendirildiğini asla anlamadım, ancak bu başka bir şeydir) ) ve kalan ck benzersiz kısıtlamalar haline gelir.

Benzersiz bir kısıtlama, birincil anahtar kutusuyla aynı şekilde kullanılabilir. Düşünmek:

create table A ( x ... not null
               , y ... not null
               , z ... not null
               ,     unique (x)
               ,     primary key (y,z) );

create table B ( x ...
               ,   ...
               ,     foreign key (x) references A (x) );

create table C ( y ...
               , z ...
               ,   ...
               ,     foreign key (y, z) references A (y, z) );  

B benzersiz kısıtlamaya ve C birincil anahtar kısıtlamasına başvurur.

NOT NULL başka bir tür kısıtlamadır. Sizin durumunuzda, bunu benzersiz olarak bildirmeden e-posta için uygulayabilirsiniz.

Gönderinizin bir sonraki yönü bir anahtarın kararlılığıyla ilgilidir, bir anahtar kararlı olmalıdır (ancak bu asla değişemeyeceği anlamına gelmez, değişmez olması gerekmez). Bazı DBMS, böyle bir işlem için yardımcı olabilecek UPDATE CASCADE üzerine uygular, yine de anahtar modelinize dağıtılırsa, bunu güncelleyen bir ağrı olur.

Sizin durumunuzda, birincil anahtar olarak başka bir aday anahtarı seçer ve e-postanın BOŞ DEĞİL ve BENZERSİZ olduğunu beyan ederim.


1
SQL Server'da benzersiz bir dizine FK olarak başvurabilirsiniz.
Martin Smith

1
Kendim için kontrol edemiyorum sql erişimim yok, benzersiz bir dizin oluşturduğunuzda dolaylı olarak benzersiz bir kısıtlama oluşturuyor mu?
Lennart

1
Hayır. Benzersiz bir kısıtlama biraz farklı şekilde ele alınır ve benzersiz bir dizine kıyasla bazı ek meta verilere ve ek kısıtlamalara sahiptir, ancak SQL Server bir FK'de kullanılmasına izin verir.
Martin Smith

1
O zaman bu biraz garip, sql standardında indekslerden bile bahsedilmezken, anahtarlar bunun merkezi bir parçası. Her neyse, bilgi için teşekkürler.
Lennart

E-postanıza yabancı anahtarlanmış çok fazla kayıt varsa, güncelleme arttığında tüm bu kayıtları güncellemenin oldukça zaman alabileceğini belirtmek gerekir.
cimmanon

6

Evet, EmailAddress sütununda benzersiz bir dizine sahip olmak uygun olmalıdır. Tek sorun, biri hizmetinize kaydolduktan sonra e-posta adresini bırakıp size söylemediyse, o zaman e-posta adresinin sahibi kaydolmaya çalışırsa olur. Ama bu oldukça nadir görülen bir durum.

Benzersiz Dizinin veritabanı platformunuza bağlı boş değerlere izin verip vermediğiyle ilgili. Oracle yapar, SQL Server tek bir NULL değerine izin verir. Sütunu NULL değerlere izin vermeyip daha sonra benzersiz bir dizin oluşturarak çözebilirsiniz.


1
SQL sunucusu için bu doğru değil. whereÖrneğin, NULLdeğerleri dizinden hariç tutmanıza izin veren yan tümceleri olan dizinler oluşturabilirsiniz .
Kirk Woll

1
İfade SQL Server allows a single NULL valuehala doğrudur. Birden fazla NULLdeğer elde etmenin bir yolu olmadığını söylemez . Bence cevaplayıcı cevabı basit tutmaya ve ekstra ayrıntıları (filtrelenmiş indekslenmiş gibi) açıklamaya çalışmıyordu.
Brandon

1
Evet, filtrelenmiş endekslerin tüm tavşanını güvercin olabilirdi ama basit bir soru genellikle basit bir cevaba ihtiyaç duyar. Bir veritabanı platformu ve sürümü olmadan cevaplarımı genel tutuyorum.
mrdenny

2

EmailAddress'te benzersiz bir dizine sahip olmak iyidir.

Uygulamanızda gerekli alan olarak E-posta Adresi olması için doğrulama olduğunu belirttiğiniz gibi, diğer doğrulamaların veritabanından olacağı için bir E-posta adresi olmayan bir kullanıcıyı kabul etmediğini ve yinelenen girişi ve bu doğrulamayı önlediğini söyleyebilirim bu Benzersiz Endeks ile uygulanacaktır.

SQL Server'ın diğer yanıtında belirtildiği gibi, benzersiz dizinler oluşturmadan önce boş değere izin vermeyen bir sütun oluşturmanız gerekir.

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.