Soru Birincil Anahtar ve Benzersiz Kısıtlama?


Şu anda yepyeni bir veritabanı tasarlıyorum. Okulda, her masaya bir ana anahtar koymayı her zaman öğrendik.

Çok fazla makale / tartışma / haber grubu yazısı okudum. Bunun yerine, PK yerine kendine özgü kısıtlama (bazı db için benzersiz dizin) kullanmanın daha iyi olduğunu söylüyor.

Bakış açınız nedir?


44
2017-10-01 16:10


Menşei




Cevaplar:


Bu makalelere referans verebilir misiniz?

Denenmiş ve doğru yöntemleri değiştirmek için bir sebep göremiyorum. Sonuçta, Ana Anahtarlar ilişkisel veritabanlarının temel tasarım özelliğidir.

Aynı amacı sunmak için BENZERSİZ kullanmak gerçekten hackish geliyor. Onların mantığı nedir?

Düzenleme: Dikkatim bu eski cevaba geri çekildi. Belki de PK'ye karşı UNIQUE ile ilgili olarak okuduğunuz tartışma, tek başına PK'yi bir tek yapması için bir şey yapan insanlarla uğraşmıştır. Bunun cevabı, eğer bir anahtar ise, o zaman anahtarlayın, aksi halde UNIQUE yapın.


38
2017-10-01 16:55



Eğer bir anahtarsa, bunu bir anahtar haline getirin, eğer benzersizse, onu benzersiz kılın. Ama gerçekten, bir anahtarın bir anahtar ve benzersiz değil ne yapar? Senin tanımın ne anahtar? - Pacerier
@Pacerier Bir Öğrenci Bilgi veritabanımız olduğunu varsayalım. Bu veritabanında, öğrenciler Birincil Anahtar StudentNumber ile tanımlanır. Öğrenciler tablosunda, SSN / SIN veya diğer bölgesel eşdeğer gibi şeyler tutarız. Anahtarlama hatası kontrolünün bir parçası olarak, bu alanın benzersiz olmasını istiyoruz. Ama bu önemli bir alan değil. (Her ne kadar olsa da, StuID ve SSN arasında 1: 1 uygunluk varsayarak) Oda Atamaları da benzersiz olabilir, ancak anahtar olamaz. (Bir öğrenciye bir odayı bir öğrenciden bir odaya atamak daha eğilimli olsa da) - Chris Cudmore
Örneğinizde, neden SSN / SIN anahtarı yapmıyorsunuz? - Pacerier
Öğrenci ödevi her ödeve ve üniversite ile öğrenci arasındaki her yazışmada yazılır. SSN'nizin bu kadar hırsızlık yapmasını gerçekten istiyor musun? Mükemmel bir dünyada, haklısın. Her şey için kullanılabilecek bir evrensel kişi kimliği. Gerçek dünyada, kurumlar kendi numaralarını insan tanımlayıcıları olarak atarlar ve diğer aday anahtarları dosyada tutarlar. - Chris Cudmore
Soruyu sormadınız ... Neden öğrenci kimliklerini birincil anahtar yapmıyorsunuz? Öğrenci kimliğinin gittiğini mi söylüyorsun değişiklik? - Pacerier


Birincil Anahtar gerçekten sadece bir aday anahtar NULL için izin vermez. Bu nedenle, SQL terimlerinde, başka hiçbir benzersiz anahtardan farklı değildir.

Ancak, teorik olmayan RDBMS'lerimiz için, Birincil Anahtarınız olmalıdır - Bunu başka türlü iddia etmedim. Bu Birincil Anahtar ise Vekil anahtarı, o zaman sen-meli Ayrıca üzerinde benzersiz kısıtlamalar var doğal anahtar (lar).

Uzaklaşmanın önemli bir yanı, benzersiz kısıtlamalara sahip olmanız gerektiğidir. herşey aday (doğal veya vekil) anahtarları. Daha sonra başvurmak için en kolay olanı seçmelisiniz. Yabancı anahtar Birincil Anahtarınız *.

Ayrıca bir kümelenmiş dizin*. bu could Birincil Anahtarınız veya doğal bir anahtar olmanız gerekir - ancak bunun da olması gerekmez. Kümelenmiş dizininizi tablonun sorgu kullanımına göre seçmelisiniz. Şüphe edildiğinde, Birincil Anahtar, kötü bir ilk tercih değildir.

  • Teknik olarak sadece bir yabancı anahtar ilişkisinde benzersiz bir anahtarı belirtmek için gerekli olmasına rağmen, standart uygulama kabul edilir çokça birincil anahtarı tercih edin. Aslında, bazı RDBMS yalnızca birincil anahtar referanslara izin verirse şaşırmam.

  • Düzenleme: Oracle'ın "kümelenmiş tablo" ve "kümelenmiş dizin" terimlerinin Sql Server'dan farklı olduğuna dikkat çekildi. Oracle-ese’da bahsettiğim şeyin karşılığı bir Dizin Siparişi Tablosu ve OLTP tabloları için tavsiye edilir - ki, bu SO sorularının ana odağı olacaktır. Büyük bir OLAP veri deposundan sorumluysanız, veritabanı tasarımı ve optimizasyonu konusunda kendi fikirlerinizi almanız gerektiğini düşünüyorum.


46
2017-10-01 16:19



Oracle, her tabloda kümelenmiş bir dizin önermez.
Üzgünüz - Ben bir MSSQL adamım, bu yüzden Oracle açısından fazla düşünmüyorum. Anladığım kadarıyla Oracle kümelenmiş tablo ve dizinlerin SQL Server kümelenmiş dizinleriyle hiçbir ilgisi yok. Oracle eşdeğeri, en az OLTP tabloları için önerilen bir Dizin Sıralı Tablo'dur. - Mark Brackett


Birincil anahtar, özel tedavi için (dizinlerin otomatik oluşturulması, vb.) Sadece bir aday anahtardır (benzersiz bir kısıtlama).

Onlara karşı tartışan milletlerin, bir anahtardan diğerine göre farklı bir muamele yapmak için bir sebep görmediklerini umuyorum. Ben burada duruyorum.

[Düzenle] Görünüşe göre kendi cevabımda bile 50 puan olmadan yorum yapamam.

@chris: Bence bir zararı yok. "Birincil Anahtar" gerçekten sadece sözdizimsel şekerdir. Onları her zaman kullanırım ama kesinlikle gerekli olduğunu düşünmüyorum. Benzersiz bir anahtar gerekli, evet, ancak mutlaka bir birincil anahtar değil.


10
2017-10-01 16:16



Tartışma için teşekkürler. Ama zarar nedir? Paradigmayı üzmek için gerekçe var mı? - Chris Cudmore
> otomatik dizin oluşturma, vb. tüm veritabanı otomatik olarak PK'lar için bir dizin oluşturmaz. Oracle, biri için mevcut bir dizini kullanabilir.


Birincil anahtar olmadan bir tabloya sahip olmak isteyeceğiniz çok nadir bir dezenfektasyon olurdu. Birincil anahtarlar, sadece kendi doğası gereği otomatik olarak PK olarak benzersiz kısıtlamalara sahiptir.

Birincil anahtarın ADDITION değerinde bir sütunda benzersizliği garanti etmek istediğinizde benzersiz bir kısıtlama kullanılır.

Her zaman bir PK'ye sahip olmak iyi bir kuraldır.

http://msdn.microsoft.com/en-us/library/ms191166.aspx


9
2017-10-01 19:20





Malısın her zaman Birincil anahtar var.

Bununla birlikte, sorunuzun yalnızca yanlış yönlendirilmiş olduğundan şüpheleniyorum ve aslında, birincil anahtarın her zaman otomatik olarak oluşturulan bir sayı (aynı zamanda temsilci anahtarı olarak da bilinir) veya gerçek anlamlı veri olan (aynı zamanda doğal olarak da bilinir) benzersiz bir alan olması gerekip gerekmediğini sormak istersiniz. anahtar), insanlar için SSN, kitapların ISBN'si vb.

Bu soru, DB alanındaki bir yaş eski dini savaştır.

Benim aldığım şey, gerçekten eşsiz ve asla değişmezse, doğal anahtarların tercih edilmesidir. Ancak, dikkatli olmalısınız, SSN'nin belirli koşullar altında değişebileceği gibi, görünüşte istikrarlı bir şey bile olmalısınız.


5
2017-10-01 16:17



kabul edersiniz, örneğin veri giriş hataları gibi sık sık değişen SSN, kimlik hırsızlığı gibi şeylerden dolayı insanlar yeni bir tane alırlar. - HLGEM
Benim sorum ne demek istediğin değil. Bir Benzersiz Anahtar Kısıtlamaya karşı gerçekten Birincil Anahtar kullanıyor. - vIceBerg
Tamam. Sonra cevap: Her zaman bir birincil anahtara sahip olmalısın. Bence sana yargılanan insanların kafası karışmış, bence PK aynı zamanda her zaman eşsiz bir anahtar. - JacquesB
Aslında bu cevabı aramaya geldim, sadece emin olmak için, eğer veri tabanımın herhangi bir koşulda hiçbir zaman değişmeyecek bir alanı varsa ve aynı zamanda birincil anahtar olarak bunu kullanmayı tercih etmem gerekiyor mu? - Pochi


Birincil anahtarlar, bu tablodan ilişki kuracağınız durumlarda bu değere referans verecek diğer tablolara kullanılmalıdır. Bununla birlikte, tablonun yapısına ve benzersiz kısıtlamayı uyguladığınızı düşündüğünüz verilere bağlı olarak, o belirli alanı bir vekil anahtar oluşturmak zorunda kalmak yerine doğal bir birincil anahtar olarak kullanabilirsiniz. Tabi ki, doğal anahtarlara karşı temsilci bir başka tartışmadır. :)

Bu tablo ve diğer tablolar arasında hiçbir ilişki kurulmayacaksa benzersiz anahtarlar kullanılabilir. Örneğin, yeni bir kullanıcı kaydı veya bazılarını eklemeden önce karşılaştırılacak geçerli e-posta adreslerinin bir listesini içeren bir tablo. Veya benzersiz anahtarlar, birincil anahtara sahip bir tabloda değerleriniz olduğunda, ancak aynı zamanda kesinlikle benzersiz olması gerektiğinde de kullanılabilir. Örneğin, kullanıcı adına sahip bir kullanıcı tablonuz varsa. Kullanıcı adını birincil anahtar olarak kullanmak istemezsiniz, ancak giriş yapmak için kullanabilmesi için benzersiz olması gerekir.


3
2017-10-01 18:20



Bazı DB ile, Benzersiz Dizininin alanında bir yabancı anahtar oluşturabilirsiniz. - vIceBerg


Tablo, üzerinde çalışırken verileri düzenlemek için geçici bir tablo olmadığı sürece, her zaman masaya birincil anahtar koymak istersiniz ve işte neden:

1 - benzersiz bir kısıtlama, boş değerlere izin verebilir, ancak birincil anahtar olabilir asla boş değerlere izin verir. Boş değerler içeren sütunlarda bir birleştirmeyle bir sorgu çalıştırırsanız, null değeri null değerine eşit olmadığından sonuçta elde edilen veri kümesinden bu satırları kaldırırsınız. Büyük şirketlerin bile muhasebe hataları yapabilmeleri ve karlarını yeniden belirlemeleri bu şekilde gerçekleşiyor. Sorguları, toplamına dahil edilmesi gereken belirli satırları göstermediler çünkü benzersiz endekslerinin bazı sütunlarında boş değerler vardı. Shoulda birincil anahtar kullandı.

2 - benzersiz bir dizin, birincil anahtara otomatik olarak yerleştirilir, böylece bir tane oluşturmanız gerekmez.

3 - çoğu veritabanı motoru otomatik olarak kümelenmiş bir dizini birincil anahtar üzerine koyar, satırlar veri bloklarında bitişik olarak saklandığından sorguları daha hızlı yapar. (Bu, sorguları hızlandıracak şekilde kümelenmiş dizini farklı bir dizine yerleştirmek için değiştirilebilir.) Bir tablonun kümelenmiş bir dizini yoksa, satırlar veri bloklarında bitişik olarak depolanmayacak ve sorgular oluşturulmayacaktır. daha yavaş çünkü okuma / yazma kafası verileri toplamak için diskin her tarafına gitmelidir.

4 - Birçok ön uç geliştirme ortamı, tabloyu güncellemek veya silme yapmak için birincil anahtar gerektirir.


3
2017-10-01 18:51



4. nokta için +1. PK olmayan bir tablo oluşturmak isteyebileceğiniz nadir durumlarda, karşılaştığım tüm GUI satır düzenleme araçları çalışmayı durduracaktır. - Daniel Yankowsky


Mantıksal yapılar ve fiziksel yapılar arasında ve benzer şekilde teori ve pratik arasında bir ayrım yapmamız gerekiyor.

Bununla başlamak için: teorik bir bakış açısıyla, birincil bir anahtarınız yoksa, bir tablonuz yoktur. Sadece bu kadar basit. Dolayısıyla, sorunuz, tablonuzun birincil anahtarı (tabii ki gerekir) olmalı, ancak RDBMS'nizde nasıl etiketlediğiniz değildir.

Fiziksel düzeyde, çoğu RDBMS, Birincil Dizin kısıtını Benzersiz Dizin olarak uygular. Seçtiğiniz RDBMS bunlardan biri ise, birincil Anahtar olarak bir sütun tanımlamak ve sadece sütuna benzersiz bir kısıtlama koymak arasında çok pratik bir fark yoktur. Ancak: bu seçeneklerden biri amacınızı ele geçirir ve diğeri olmaz. Yani karar, no-brainer.

Ayrıca, bazı RDBMS'ler, Ana Anahtarlar uygun şekilde etiketlendiğinde, örneğin şemalama ve yarı otomatik yabancı anahtar kısıtlama desteği gibi ek özellikler sağlar.

Genel Kurallar yerine Ana Anahtarlar yerine Benzersiz Kısıtlamaları kullanmanız gerektiğini söyleyen herkes güzel bir lanetlenmiş iyi bir neden sunmalıdır.


2
2017-10-01 16:18





asıl anahtar, bir tablonun tek bir kaydını tek bir şekilde tanımlayan bir veya daha fazla sütun olabilir; burada, Benzersiz Kısıtlama, bir tabloda sadece belirli bir veri elemanının sadece tek bir örneğini sağlayan bir alan üzerinde bir kısıtlamadır.

PERSONALLY, tablolarım arasında çapraz referans vermek için kullanılan benzersiz anahtarlar için GUID veya otomatik artımlı BIGINTS (SQL SERVER için Identity Insert) kullanıyorum. Sonra kullanıcının belirli kayıtları seçmesine izin vermek için diğer verileri kullanacağım.

Örneğin, çalışanların bir listesini alacağım ve sahne arkasında kullandığım her kayda bir GUID ekledim, ancak kullanıcı bir çalışanı seçtiğinde, aşağıdaki alanları temel alarak bunları seçiyorlar: LastName + FirstName + ÇalışanNumber.

Bu anahtardaki birincil anahtarım, LastName + FirstName + EmployeeNumber, benzersiz anahtar ise ilişkili GUID'dir.


1
2017-10-01 19:02



Ben de böyle yaparım: birincil anahtar olarak 'private' id '(genellikle BIGINT) kullanın. Normalleştirme amaçları için kaynakları kaynakta veya tetikleyici olarak uygularım. Bir veritabanının tüm verileri yakalaması gerektiğine ve verilerin manipülasyonunun başka bir yere yapıldığına inanıyorum. - slashmais