Apakah saya memerlukan kolom ID terpisah untuk tabel "pemetaan" ini?

10

Saya memiliki tabel Producersdan tabel Products, yang keduanya berbentuk:

  • Id - int, Kunci primer
  • Name - nvarchar

Seorang Produser dapat membawa banyak Produk, jadi saya akan membuat tabel bernama ProducerDetailsyang akan memiliki:

  • ProducerId - int, Kunci asing untuk Producers.Id
  • ProductId - int, Kunci asing untuk Products.Id

Kemudian saya mulai bertanya pada diri sendiri, jadi saya pikir saya akan bertanya kepada para ahli. Apakah akan lebih baik desain database untuk memiliki Idkolom tambahan (int, kunci utama) di ProducerDetailstabel saya ? Atau itu tidak perlu?

Saya menggunakan SQL-Server 2008 R2 jika itu membuat perbedaan sama sekali.

EDIT - Hubungan antara tabel ini akan banyak-ke-banyak saya percaya, maaf saya tidak menjelaskannya. Seorang produsen dapat membawa banyak jenis produk, dan produk yang sama dapat diproduksi oleh banyak produsen yang berbeda.

Saya minta maaf jika pertanyaan ini terlalu sederhana, integritas referensial / desain basis data bukan alasan kuat saya (walaupun saya sedang mencoba untuk memperbaikinya).

Josh Darnell
sumber

Jawaban:

6

Jika Anda memiliki hubungan satu-ke-banyak antara Produsen dan Produk (dengan kata lain, suatu produk hanya dapat menjadi milik satu produsen), maka masuk akal untuk meletakkan referensi kunci asing langsung di Productstabel Anda :

Satu-ke-banyak

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

Tetapi jika ada kemungkinan bahwa ini akan menjadi hubungan banyak-ke-banyak, maka taruhan terbaik Anda adalah menggunakan tabel Bergabung.

Banyak ke banyak

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

Jika Anda memutuskan untuk pergi dengan tabel Gabung, Anda tidak perlu memiliki kunci tambahan, karena kombinasi pada ProductId/ProducerIdakhirnya akan unik. Anda bisa menggunakannya sebagai kunci komposit, sehingga Anda tidak akan membutuhkan tambahan Idlapangan di ProductProducer.

Thomas Stringer
sumber
1
Anda tidak menjawab pertanyaan yang sebenarnya - dia bertanya apakah ada nilai dalam memiliki idbidang dalam tabel hubungannya?
JNK
@ JNK Saya telah mengedit pertanyaan saya. Jika ProductId, ProducerIdmerupakan kombinasi unik, saya tidak melihat perlunya menambahkan kunci buatan lain ke tabel Gabung. Sepakat? Dan saya pikir, kecuali saya salah memahami pertanyaan, OP bahkan tidak perlu menggunakan tabel Gabung untuk kasus penggunaan ini.
Thomas Stringer
@ jadarnel27 Ok, terima kasih atas klarifikasi. Saya telah mencoret sebagian dari jawaban saya (meskipun saya pikir lebih baik memiliki jejak kaki untuk referensi lebih lanjut).
Thomas Stringer
7

Tidak, tidak ada nilai dalam menambahkan "kunci utama" tambahan ke tabel ini. Gabungan Anda hanya akan merujuk ProducerIDdan ProductID, jadi itu hanya bobot mati. MENURUT OPINI SAYA.

Meskipun saya setuju dengan @Shark bahwa tabel bergabung sepertinya tidak diperlukan di sini, kecuali jika Anda tidak ingin mengubah skema tabel yang ada dengan cara apa pun.

Sebagai tambahan, saya juga berpikir ada baiknya untuk memberi nama pengidentifikasi utama Anda secara penuh (misalnya Products.ProductIDalih-alih Products.ID) sehingga pengidentifikasi secara konsisten disebutkan di seluruh skema.

Aaron Bertrand
sumber
@ jadarnel27: Untuk semua kolom lainnya, ya, itu dianggap praktik buruk. Untuk kolom PK, banyak yang lebih suka menggunakan gaya ini ( ProductID). Satu keuntungan adalah bahwa ketika Anda melihat SometableID, Anda langsung tahu tabel yang dimaksud. Yang lain adalah Anda bisa menggunakan Product JOIN ProducerDetail USING(ProductID)sintaks, alih-alih lebih lamaProduct JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
ypercubeᵀᴹ
Maaf, saya pikir USING(ProductID)ini tidak tersedia di SQL-Server, jadi titik itu tidak berlaku.
ypercubeᵀᴹ