Mengapa menggunakan banyak kolom sebagai kunci utama (kunci utama komposit)

109

Contoh ini diambil dari w3schools .

CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)

Pemahaman saya adalah bahwa kedua kolom bersama ( P_Iddan LastName) mewakili kunci utama untuk tabel Persons. Apakah ini benar?

  • Mengapa seseorang ingin menggunakan beberapa kolom sebagai kunci utama daripada satu kolom?
  • Berapa banyak kolom yang dapat digunakan bersama sebagai kunci utama dalam tabel tertentu?
rockbala
sumber
... sekarang ada juga jawaban untuk pertanyaan ke-2
Wolf
1
@Tokopedia Mengapa Jawaban dihapus?
PerformanceDBA

Jawaban:

119

Pemahaman Anda benar.

Anda akan melakukan ini dalam banyak kasus. Salah satu contohnya adalah dalam hubungan seperti OrderHeaderdan OrderDetail. PK di OrderHeadermungkin OrderNumber. PK di OrderDetailmungkin OrderNumberDAN LineNumber. Jika itu salah satu dari keduanya, itu tidak akan unik, tetapi kombinasi keduanya dijamin unik.

Alternatifnya adalah dengan menggunakan kunci primer yang dihasilkan (non-cerdas), misalnya dalam kasus ini OrderDetailId. Tapi kemudian Anda tidak akan selalu melihat hubungan itu dengan mudah. Beberapa orang lebih suka satu cara; beberapa lebih memilih cara lain.

MJB
sumber
2
Apakah ini berguna jika saya menggunakan branch_id dan menggunakan replikasi antara dua database, akan menyelesaikan duplikat id? !!
Mhmd
11
Perhatikan bahwa dalam banyak kasus menggunakan kunci utama yang dihasilkan, Anda sering kali masih menginginkan kunci unik pada nilai gabungan.
Bacon Bits
Tolong uraikan lebih lanjut tentang "Beberapa orang lebih suka satu cara; beberapa lebih suka cara lain".
Nama pengguna
1
Mohon penjelasannya? Tidak yakin harus berkata apa. Saya telah mengenal orang-orang yang lebih suka memiliki beberapa bidang gabungan sebagai kunci karena lebih mudah secara intuitif untuk memahami apa yang mereka lihat. Saya telah mengenal orang lain yang lebih suka menetapkan kunci unik untuk setiap baris karena lebih mudah dan lebih cepat untuk mengetik. Itukah yang kamu tanyakan?
MJB
Pesan itu dimaksudkan untuk @Username. Saya lupa mengarahkannya.
MJB
26

Contoh lain dari kunci utama majemuk adalah penggunaan tabel Asosiasi. Misalkan Anda memiliki tabel orang yang berisi sekumpulan orang dan tabel grup yang berisi sekumpulan grup. Sekarang Anda ingin membuat hubungan banyak ke banyak pada orang dan grup. Artinya setiap orang bisa tergabung dalam banyak kelompok. Berikut adalah tampilan struktur tabel menggunakan kunci utama majemuk.

Create Table Person(
PersonID int Not Null,
FirstName varchar(50),
LastName varchar(50),
Constraint PK_Person PRIMARY KEY (PersonID))

Create Table Group (
GroupId int Not Null,
GroupName varchar(50),
Constraint PK_Group PRIMARY KEY (GroupId))

Create Table GroupMember (
GroupId int Not Null,
PersonId int Not Null,
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId),
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId),
CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID))
John Hartsock
sumber
Penjelasan yang bagus: Saya pikir kebutuhan atribut untuk relasi m-ke-n (dalam fasion yang dinormalisasi) adalah kuncinya.
Wolf
mungkin menambahkan sedikit penjelasan manfaat akan lebih baik
Martian2049
10

Contoh W3Schools tidak mengatakan kapan Anda harus menggunakan kunci utama majemuk, dan hanya memberikan contoh sintaks menggunakan tabel contoh yang sama seperti untuk kunci lainnya.

Pilihan contoh mereka mungkin menyesatkan Anda dengan menggabungkan kunci yang tidak berarti (P_Id) dan kunci alami (LastName). Pilihan kunci primer yang aneh ini mengatakan bahwa baris berikut valid sesuai dengan skema dan diperlukan untuk mengidentifikasi siswa secara unik. Secara intuitif ini tidak masuk akal.

1234     Jobs
1234     Gates

Bacaan Lebih Lanjut: Debat kunci utama yang hebat atau hanya Google meaningless primary keysatau bahkan membaca pertanyaan SO ini

FWIW - 2 sen saya adalah untuk menghindari kunci utama multi-kolom dan menggunakan satu bidang id yang dihasilkan (kunci pengganti) sebagai kunci utama dan menambahkan batasan (unik) tambahan jika diperlukan.

Robert Paulson
sumber
1
1) tautan "debat kunci utama yang hebat" sangat bodoh, infonya hanya untuk kepentingan diri sendiri dan salah. 2) Indeks pada kolom yang membuat baris unik tidak dapat dihindari. ID "pengganti" dengan indeks selalu merupakan kolom tambahan dan indeks tambahan. Agak konyol karena mubazir. Dan lebih lambat.
PerformanceDBA
2
"Debat kunci utama yang hebat" tidaklah bodoh. Ini adalah masalah yang sangat valid dari pengembang yang bukan pengembang sql atau sql DBA dan tidak menghabiskan seluruh waktu mereka di sql. Bahkan di sql murni saya lebih suka memiliki kunci yang dihasilkan otomatis yang tidak berarti sebagai kunci utama saat bergabung daripada harus ingat untuk melewatkan n bit data di sekitar menjadi kunci alami. Anda dipersilakan untuk melihat sudut pandang Anda, tetapi kami menghargai tidak begitu meremehkan.
Robert Paulson
4

Anda menggunakan kunci majemuk (kunci dengan lebih dari satu atribut) setiap kali Anda ingin memastikan keunikan kombinasi beberapa atribut. Kunci atribut tunggal tidak akan mencapai hal yang sama.

nvogel
sumber
1
Untuk memastikan kunci unik, Anda mungkin mengandalkan kombinasi dua atribut untuk membentuk kunci yang secara logis tidak dapat diduplikasi, Orang dan tanggal kelulusan dari kumpulan data yang lebih besar akan menjadi contoh.
Yohanes Markus
3

Ya, keduanya membentuk kunci utama. Terutama dalam tabel di mana Anda tidak memiliki kunci pengganti , mungkin perlu untuk menentukan beberapa atribut sebagai pengenal unik untuk setiap catatan (contoh buruk: tabel dengan nama depan dan nama belakang mungkin memerlukan kombinasi keduanya untuk dijadikan unik).

ig0774
sumber
3

Beberapa kolom dalam sebuah kunci akan, secara umum, berkinerja lebih buruk daripada kunci pengganti. Saya lebih suka memiliki kunci pengganti dan kemudian indeks unik pada kunci multikolom. Dengan begitu Anda bisa memiliki performa yang lebih baik dan keunikan yang dibutuhkan tetap terjaga. Dan lebih baik lagi, ketika salah satu nilai dalam kunci tersebut berubah, Anda tidak perlu memperbarui satu juta entri turunan dalam 215 tabel anak.

HLGEM
sumber
1
1) Kinerja. Tidak dalam platform SQL (mungkin dengan berpura-pura "sql" dan freeware). 2) Preferensi tidak relevan. Apa yang dibutuhkan tabel, untuk integritas, adalah relevan. 3) ID "pengganti" dengan indeks selalu merupakan kolom tambahan dan indeks tambahan . Jadi itu akan lebih lambat, di platform apa pun. Re kinerja, Anda bertentangan dengan diri Anda sendiri. 4) Jika Anda tidak tahu cara memperbarui mitos "juta entri anak dalam 215 tabel anak" dengan benar , ajukan pertanyaan.
PerformanceDBA
2
Saya tidak setuju dengan pernyataan 'Beberapa kolom dalam sebuah kunci akan, secara umum, berkinerja lebih buruk daripada kunci pengganti'. Seringkali kueri tambahan diperlukan untuk mendapatkan kunci pengganti suatu hubungan saat Anda mempertimbangkannya. Pada titik mana itu adalah perjalanan pulang pergi ekstra penuh lebih lambat dari segi kinerja.
ttugates
3

Pertanyaan kedua Anda

Berapa banyak kolom yang dapat digunakan bersama sebagai kunci utama dalam tabel tertentu?

adalah implementasi spesifik: itu didefinisikan dalam DBMS aktual yang sedang digunakan. [1], [2], [3] Anda harus memeriksa spesifikasi teknis dari sistem database yang Anda gunakan. Beberapa sangat rinci, beberapa tidak. Menelusuri web tentang batasan semacam itu bisa jadi sulit karena terminologinya bervariasi. Istilah kunci primer komposit harus wajib;)

Jika Anda tidak dapat menemukan informasi eksplisit, coba buat database pengujian untuk memastikan Anda dapat mengharapkan penanganan yang stabil (dan spesifik) dari pelanggaran batas (yang diharapkan). Berhati-hatilah untuk mendapatkan informasi yang benar tentang ini: terkadang batas terakumulasi, dan Anda akan melihat hasil yang berbeda dengan tata letak database yang berbeda.


Serigala
sumber
2

Menggunakan kunci utama di beberapa tabel sangat berguna saat Anda menggunakan tabel perantara dalam database relasional.

Saya akan menggunakan database yang pernah saya buat sebagai contoh dan khususnya tiga tabel di dalam tabel itu. Saya membuat database untuk webcomic beberapa tahun yang lalu. Satu tabel disebut "komik" —daftar semua komik, judulnya, nama file gambarnya, dll. Kunci utamanya adalah "comicnum".

Tabel kedua adalah "karakter" —nama mereka dan deskripsi singkat. Kunci utama ada di "charname".

Karena setiap komik — dengan beberapa pengecualian — memiliki banyak karakter dan setiap karakter muncul dalam beberapa komik, tidak praktis untuk meletakkan kolom di "karakter" atau "komik" untuk mencerminkannya. Sebaliknya, saya membuat tabel ketiga yang disebut "comicchars", dan itu adalah daftar karakter mana yang muncul di komik. Karena tabel ini pada dasarnya bergabung dengan dua tabel, maka diperlukan dua kolom: charname dan comicnum, dan kunci utama ada di keduanya.

Mr Initial Man
sumber
1

Kami membuat kunci primer komposit untuk menjamin nilai kolom keunikan yang menyusun satu rekaman. Ini adalah kendala yang membantu mencegah penyisipan data yang tidak boleh digandakan.

yaitu: Jika semua ID siswa dan nomor akta kelahiran ditetapkan secara unik untuk satu orang. Maka, sebaiknya jadikan kunci utama untuk seseorang sebagai komposisi nomor pelajar dan akta kelahiran karena akan mencegah Anda memasukkan dua orang yang memiliki ID pelajar dan akta kelahiran yang berbeda secara tidak sengaja.

kiwicomb123
sumber