Her tablonun birincil anahtarı olmalı mı?


341

Bir veritabanı tablosu oluşturuyorum ve ona atanmış bir mantıksal birincil anahtar yok. Yani, birincil anahtar olmadan bırakmayı düşünüyorum, ama biraz suçlu hissediyorum. Yapmalımıyım?

Her tablonun birincil anahtarı olmalı mı?


5
Tablo hakkında biraz daha bilgi verebilir misiniz? Cevap muhtemelen "evet" dir.
Ryan Bair

7
Evet, her tablonun birincil anahtarı olmalıdır.
Syed Tayyab Ali

Yanıtlar:


314

Kısa cevap: evet .

Uzun cevap:

  • Masanızın bir şeye katılabilir olması gerekir
  • Tablonuzun kümelenmesini istiyorsanız, bir tür birincil anahtara ihtiyacınız vardır.
  • Tablo tasarımınızın birincil bir anahtara ihtiyacı yoksa, tasarımınızı yeniden düşünün: büyük olasılıkla bir şey eksiksiniz. Neden aynı kayıtları tutmalı?

MySQL'de, InnoDB depolama motoru, açıkça belirtmediyseniz her zaman birincil bir anahtar oluşturur, böylece erişiminiz olmayan ekstra bir sütun oluşturur.

Birincil anahtarın birleşik olabileceğini unutmayın.

Çoktan çoğa bağlantı tablonuz varsa, bağlantıda yer alan tüm alanlarda birincil anahtarı oluşturursunuz. Böylece, bir bağlantıyı tanımlayan iki veya daha fazla kaydınız olmadığından emin olursunuz.

Mantıksal tutarlılık sorunlarının yanı sıra, çoğu RDBMS motoru bu alanları benzersiz bir dizine dahil etmekten fayda sağlayacaktır.

Ve herhangi bir birincil anahtar benzersiz bir dizin oluşturmayı içerdiğinden, bunu bildirmeli ve hem mantıksal tutarlılık hem de performans elde etmelisiniz.

Benzersiz veriler üzerinde neden her zaman benzersiz bir dizin oluşturmanız gerektiğini öğrenmek için blogumda bu makaleye bakın:

Not: Birincil anahtara ihtiyaç duymadığınız bazı çok, çok özel durumlar vardır.

Çoğunlukla yok günlük masaları yer almaktadır herhangi performans nedenleriyle endeksler.


hala birincil anahtarları var, bileşik olan
kristof

2
@annakata: bileşik bir birincil anahtarları olmalı
Quassnoi

1
"Ve herhangi bir birincil anahtar benzersiz bir dizin oluşturmayı içerdiğinden" Oracle için geçerli değil. Birincil anahtarı zorlamak için benzersiz olmayan bir dizin kullanılabilir. Aslında, benzersiz ve PK kısıtlamalarının benzersiz olmayan dizinler kullanması bazen GEREKLİDİR.
Stephanie Page

3
"Neden aynı kayıtları tutmalıyım?" Yalnızca bir PK eklemenin, çoğaltma olmadığından emin olmayacağını unutmayın. Genellikle PK kullanıcı tarafından görülmez, bu nedenle önemli olan yinelenen veriler içerebilen görünür alanlardadır. Tasarımınıza bağlı olarak bu istenebilir veya edilmeyebilir.
Rossco

1
Anahtarların birleştirilebilirlikle ilgisi yoktur. Kümeleme argümanı, hangi DBMS'yi kullandığınıza bağlıdır ve mantıksal ve fiziksel düşünceleri karıştırır.
Jon Heggland

36

Birincil anahtara sahip olmak her zaman en iyisidir. Bu şekilde ilk normal formu karşılar ve veritabanı normalleştirme yolu boyunca devam etmenizi sağlar .

Başkaları tarafından belirtildiği gibi, birincil anahtarın olmamasının bazı nedenleri vardır, ancak birincil anahtar varsa çoğu zarar görmez


5
@PaulSuart Verilerin her zaman normal formlarında olması gerekmez. Aslında, veriler çok büyük olduğunda, normal biçiminde tutulmamalıdır, aksi takdirde tabloya katılma vb. Sorgular için verilere erişmek korkunç derecede yavaş olacaktır. Normal formlar bir "idealleştirmedir" ve pratik olarak ancak verilerin büyümesi beklenmediğinde mümkündür. Kocaman.
Pacerier

13

Hemen hemen birincil anahtar olmadan bir tablo oluşturduğumda, bir masaya ihtiyacım olmayacağını düşünerek, geri dönüp bir tane ekledim. Şimdi birincil anahtar olarak kullandığım otomatik oluşturulan kimlik alanı ile birleştirme tablolarımı bile oluşturuyorum.


13
Birleştirme tablosu birincil anahtardır - birleştirilen her iki kaydın PK'larından oluşan bileşik bir anahtardır. Örneğin TABLO KİŞİSELİ OLUŞTUR (PersonId int, OrderId int, PRIMARY KEY (PersonId, OrderId)).
Keith Williams

3
Evet, ancak Bağlantı Tablosu'nun üçüncü bir niteliği varsa, "OrderDate" diyelim. Bunu bileşik anahtara da ekler misiniz? IMHO no - çünkü daha fazla azaltılabilir ve birincil anahtarda olması gereken indirgenemez karakteristiklere hizmet etmez.
stevek

13

Birkaç çok nadir durum (muhtemelen çoktan çoğa ilişki tablosu veya geçici olarak çok miktarda veri toplu olarak yüklemek için kullandığınız bir tablo) dışında şunu söyleyebilirim:

Birincil anahtarı yoksa, tablo değildir!

üzüm posası


10
Açıkça söylemek gerekirse bu cümle yanlıştır. Tablolar, Sorgu Diliniz tarafından oluşturulan "Tabloları Görüntüle" olabilir. RDBMS, tablolar değil ilişkilerden oluşur. Bu cümle şunu söylemelidir: "Birincil anahtarı yoksa, bu bir ilişki değildir!".
stevek

Veya belki, "aday anahtarı yoksa, o zaman ilişkisel bir tablo değildir". Ancak bir ilişkiyi temsil etmeyen bir masaya sahip olmanın çok nadir olduğu durumlara bakın.
Walter Mitty

Neden çoktan çoğa tablonun birincil anahtarı olmaz? Ayrı bir birincil anahtar oluşturabilir ve ardından yabancı anahtarların vekili için benzersiz bir dizin oluşturabilirsiniz. Her masada birincil anahtar olması daha iyi olur. Toplu yükleme tablosunda bile, bir ETL işleminde yinelenen kayıtları tanımlamanıza yardımcı olabileceğinden, içe aktarılan verileri içermeyen bir birincil anahtarı ayrı ayrı tanımlamak isteyebilirsiniz. Bana öyle geliyor ki, her seferinde biraz daha depolama olsa bile, her tablonun birincil anahtarı olması gerekir. Görünüm tarafından oluşturulan tablo, tablonun kendisi değil tablonun bir alt kümesidir.
John Ernest

1
Çoktan çoğa ilişki tablosunda, ilişkilerin her iki kimliğinden oluşan bileşik birincil anahtar oluşturabilirsiniz.
Jaap

8

Sadece ekleyin, daha sonra yapmadığınız için üzgün olacaksınız (seçme, silme. Bağlama, vb.)


8

Bu masaya başka masalara katılmanız gerekecek mi? Bir kaydı benzersiz bir şekilde tanımlamanın bir yolunu mu arıyorsunuz? Cevabınız evet ise, birincil bir anahtara ihtiyacınız vardır. Verilerinizin, müşteri olan kişilerin adlarını içeren bir müşteri tablosu gibi olduğunu varsayın. Doğal bir anahtar olmayabilir, çünkü bu Sally Smith'in bu Sally Smith'ten farklı olup olmadığını belirlemek için adreslere, e-postalara, telefon numaralarına vb. İhtiyacınız vardır. Sally Smith'in John Jones ile evlendiğini ve Sally Jones haline geldiğini varsayalım. Masanın üzerinde yapay bir anahtar yoksa, adı güncellediğinizde, sadece bir tanesi evlenmiş ve adını değiştirmiş olsa bile, 7 Sally Smith'i Sally Jones olarak değiştirdiniz.

Doğal bir anahtarınız olmadığını söylüyorsunuz, bu nedenle benzersiz yapmak için herhangi bir alan kombinasyonunuz yok, bu da yapay anahtarı kritik hale getiriyor.

Doğal bir anahtarım olmadığında buldum, yapay bir anahtar veri bütünlüğünü korumak için mutlak bir zorunluluktur. Doğal bir anahtarınız varsa, bunu anahtar alanı olarak kullanabilirsiniz. Ancak kişisel anahtar, doğal anahtar bir alan olmadığı sürece, doğal anahtarda yapay anahtar ve benzersiz bir dizin tercih ederim. Eğer içeri sokmazsan daha sonra pişman olursun.


6

Her masada bir PK olması iyi bir uygulamadır, ancak bu bir zorunluluk değildir. Büyük olasılıkla, ihtiyacınıza göre benzersiz bir dizine ve / veya kümelenmiş bir dizine (PK ya da değil) ihtiyacınız olacaktır.

Çevrimiçi Kitaplar'daki (SQL Server için) Birincil Anahtarlar ve Kümelenmiş Dizinler bölümlerine göz atın

" PRIMARY KEY kısıtlamaları, tablodaki bir satırı benzersiz olarak tanımlayan değerlere sahip sütunu veya sütun kümesini tanımlar. Tablodaki iki satır aynı birincil anahtar değerine sahip olamaz. Birincil anahtardaki hiçbir sütun için NULL giremezsiniz. birincil anahtar olarak küçük, tamsayı bir sütun kullanmanızı öneririz. Her tablonun birincil anahtarı olmalıdır. Birincil anahtar değeri olarak nitelenen bir sütun veya sütun birleşimi, aday anahtar olarak adlandırılır. "

Ancak, şunu da kontrol edin: http://www.aisintl.com/case/primary_and_foreign_key.html



4
bu sayfa oldukça aptalca. İlk olarak, performans nedeniyle birincil anahtar gereklidir. Sayfasını okuyarak bir kitap tablosuna kimlik eklemenin işe yaramaz olduğunu öğrendim çünkü kitabın metni benzersiz; Açıkçası, adam asla veritabanlarıyla çalışmadı.Ama ne eleştirdiğini anlamada da sorunları var. 1) Bir PK değerinin bir satıra referans yaptığı yazılı 2) herhangi bir sütun kümesiyle 2 tabloya katılabilirsiniz. Çelişki yok. Akademik bir makale yazarının ilişkisel teorinin temelini anlamaması şaşırtıcıdır.
Federico Razzoli

1
"İlk olarak, performans nedenleriyle birincil anahtar gereklidir" bu yanlıştır, PK performansı doğrudan etkilemez. PK'ye sahip olmama birçok soruna yol açabilir (bir sırayı belirleme, birleştirme vb.), Ancak performans bunlardan biri değildir. Bir tablo üzerinde PK oluşturduğunuzda SQL sunucusu benzersiz bir kümelenmiş dizin oluşturur, bu dizin PK'nin kendisini değil performansı etkiler. Gerçek bir örnek olarak, tüm sorgular bir tarih aralığına (benim durumumda) sahip olduğundan satırlarımın tablodaki tarih sütununa göre fiziksel olarak sıralanması gerektiğinden, tablomda tarih sütununda kümelenmiş bir dizin ve GUID alanında bir PK var.
endo64

Bu kümelenmiş dizin, SQL Server ve diğer birkaç DBMS tarafından oluşturulan birincil anahtarın bir lezzetidir. Kullanmanın iyi bir fikir olduğundan emin misiniz? Örneğin, MySQL'de, belgelenmemiş birkaç nedenden dolayı değildir.
Federico Razzoli

1
GUID'nin InnoDB'de PK'ler için en uygun tür olmadığını unutmayın. Tüm dizinler PK'ya bir referans içerir, bu nedenle PK ne kadar büyükse, diğer tüm dizinler de o kadar büyük olur.
Federico Razzoli

6

Önerilen cevaba katılmıyorum. Kısa cevap: HAYIR .

Birincil anahtarın amacı, başka bir tabloyla ilişki oluşturmak için tablodaki bir satırı benzersiz olarak tanımlamaktır. Geleneksel olarak, bu amaçla otomatik olarak artırılan bir tam sayı değeri kullanılır, ancak bunun varyasyonları vardır.

Bununla birlikte, örneğin, böyle bir anahtarın varlığının basitçe gerekli olmadığı ve sadece belleği kapladığı zaman serisi verilerini günlüğe kaydetmek vardır. Bir satırı benzersiz yapmak sadece ... gerekli değildir!

Küçük bir örnek: Tablo A: LogData

Columns:  DateAndTime, UserId, AttribA, AttribB, AttribC etc...

Birincil Anahtar gerekmez.

Tablo B: Kullanıcı

Columns: Id, FirstName, LastName etc. 

LogData tablosuna "yabancı anahtar" olarak kullanılabilmesi için Birincil Anahtar (Id) gerekir.


3

NET'te gridview'in bazı özelliklerini kullanmak için gridview'ın hangi satırın güncellenmesi / silinmesi gerektiğini bilmesi için birincil bir anahtara ihtiyacınız olduğunu biliyorum. Genel uygulama, birincil anahtar veya birincil anahtar kümesine sahip olmalıdır. Ben şahsen öncekini tercih ederim.


3

Gelecekte bunu kanıtlamak için gerçekten yapmalısınız. Eğer çoğaltmak istiyorsanız, buna ihtiyacınız olacak. Başka bir masaya katılmak istiyorsanız (ve gelecek yıl sürdürmek zorunda olan fakir aptalların) hayatınız çok daha kolay olacaktır.


Henüz gerekli olduğuna ikna olmadım, ama "yap çünkü aksi takdirde birileri daha sonra sonuçlarla uğraşmak zorunda kalacak" bunu yapmamı sağlamak için yeterli. Eğer küçülmeyi denemeye değer görünüyorsa her zaman sütunu daha sonra bırakabilirim ...
ArtOfWarfare

3

Açık deniz geliştirme ekibi tarafından oluşturulan uygulamanın sürdürülmesinde rol oynuyorum. Şimdi özgün veritabanı şeması bazı tablolarda PRIMARY KEYS içermiyor çünkü uygulamada her türlü sorunları yaşıyorum. Bu yüzden lütfen zayıf tasarımınız nedeniyle diğer insanların acı çekmesine izin vermeyin. Tablolarda birincil anahtarların bulunması her zaman iyi bir fikirdir.


2

Her zaman birincil bir anahtarım var, başlangıçta bunun için henüz bir amacım olmasa bile. Sonunda bir tabloya sahip olmayan bir PK'ya ihtiyacım olduğunda birkaç kez oldu ve daha sonra koymak her zaman daha fazla sorun. Ben her zaman bir dahil olmak üzere bir ters daha fazla olduğunu düşünüyorum.


1

Kısacası, hayır. Ancak, belirli istemci erişimi CRUD işlemlerinin gerektirdiğini unutmayın. Gelecekteki prova işlemleri için daima birincil anahtarları kullanma eğilimindeyim.


1

Hazırda Bekletme modunu kullanıyorsanız, birincil anahtar olmadan bir Varlık oluşturmak mümkün değildir. Düz sql / ddl komut dosyalarıyla oluşturulan varolan bir veritabanıyla çalışıyorsanız ve birincil anahtar eklenmediyse, bu sorunlar sorun oluşturabilir

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.