Bu “eşleme” tablosu için ayrı bir Kimlik sütununa ihtiyacım var mı?


10

Bir tablo Producersve bir tablo var Products, her ikisi de formda olan:

  • Id - int, Birincil anahtar
  • Name - nvarchar

Bir Üretici birden fazla Ürün taşıyabilir, bu yüzden şöyle bir tablo oluşturacaktım ProducerDetails:

  • ProducerId - int, Yabancı anahtar Producers.Id
  • ProductId - int, Yabancı anahtar Products.Id

Sonra kendimi sorgulamaya başladım, bu yüzden uzmanlara soracağımı düşündüm. Masamda ek bir Id(int, Primary anahtar) sütun olması daha iyi bir veritabanı tasarımı olur ProducerDetailsmu? Yoksa bu gereksiz mi?

Hiç fark etmezse SQL-Server 2008 R2 kullanıyorum.

EDIT - Bu tablolar arasındaki ilişki çok-çok olurdu inanıyorum, üzgünüm bunu açıklığa kavuşturmadım. Bir üretici birden fazla ürün türünü taşıyabilir ve aynı ürün birden çok farklı üretici tarafından üretilebilir.

Bu soru aşırı basitse özür dilerim, referans bütünlüğü / veritabanı tasarımı benim güçlü takımım değil (ancak bunu geliştirmeye çalışıyorum).

Yanıtlar:


6

Üreticiler ve Ürünler arasında bire çok ilişkiniz varsa (başka bir deyişle, bir ürün yalnızca bir üreticiye ait olabilir), doğrudan Productstablonuza doğrudan yabancı anahtar referansı koymak mantıklı olacaktır :

Bir-çok

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null,
    Name varchar(100) not null,
    ProducerId int not null foreign key references Producer(id)
)
go

Ancak, bunun çoktan çoğa bir ilişki olma şansı varsa, en iyi bahsiniz bir Katıl tablosu kullanmak olacaktır.

Birçok-çok

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table ProductProducer
(
    ProductId int not null foreign key references Product(id),
    ProducerId int not null foreign key references Producer(id)
)
go

-- adding the primary key also ensures uniqueness
alter table ProductProducer
add constraint PK_ProductProducer 
primary key (ProductId, ProducerId)
go

Birleştir tablosuna gitmeye karar verirseniz, ek bir anahtara sahip olmanız gerekmeyecektir, çünkü bunların kombinasyonu ProductId/ProducerIdnihayetinde benzersiz olacaktır. Bunları bileşik anahtar olarak kullanabilirsiniz, böylece Idiçindeki ek alana ihtiyacınız olmaz ProductProducer.


1
Ama asıl soruyu cevaplamıyorsunuz - idilişki tablosunda bir alanın olmasının bir değeri var mı diye soruyor.
JNK

@JNK Sorumumu düzenledim. Eğer ProductId, ProducerIdbenzersiz kombinasyon, ben tablo Üyelik için başka suni anahtarı eklemek için gerek görmüyorum. Kabul? Ve bence, soruyu yanlış anlamadığım sürece, OP'nin bu kullanım durumu için bir Join tablosu kullanması bile gerekmez.
Thomas Stringer

@ jadarnel27 Tamam, açıklama için teşekkürler. Cevabımın bu bölümünü aştım (daha fazla referans için bazı ayak izine sahip olmanın ihtiyatlı olduğunu düşünüyorum).
Thomas Stringer

7

Hayır, bu tabloya ek bir "birincil anahtar" eklemenin değeri yoktur. Birleştirmeleriniz sadece anlatacak ProducerIDve ProductIDbu sadece ölü ağırlık. BENİM NACİZANE FİKRİME GÖRE.

@Shark'a katılıyorum, ancak mevcut tabloların şemasını herhangi bir şekilde değiştirmemek için kendi yolunuzdan gitmediğiniz sürece, katılma tablosunun burada bile gerekli olmadığı görülüyor.

Bir yana, ayrıca tanımlayıcı şema boyunca tutarlı bir şekilde adlandırılması için birincil tanımlayıcınızı tam olarak (örneğin Products.ProductIDyerine Products.ID) adlandırmaya değer olduğunu düşünüyorum .


@ jadarnel27: Diğer tüm sütunlar için, evet, kötü uygulama olarak kabul edilir. PK sütunu için, çoğu bu stili ( ProductID) kullanmayı tercih eder . Bir avantaj, bir gördüğünüzde SometableID, hangi tabloya atıfta bulunduğunu hemen biliyor olmanızdır. Bir diğeri ise Product JOIN ProducerDetail USING(ProductID)daha uzun yerine sözdizimini kullanabilmenizdirProduct JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
ypercubeᵀᴹ

Üzgünüz, bence USING(ProductID)SQL Server'da mevcut değil, bu yüzden bu nokta geçerli değil.
ypercubeᵀᴹ
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.