Ini adalah penyederhanaan berlebihan dari pengaturan yang intens yang saya kerjakan. table_1
dan table_2
keduanya memiliki kunci primer pengganti auto-increment sebagai ID. info
adalah tabel yang berisi informasi tentang keduanya table_1
dan table_2
.
table_1 (id, field)
table_2 (id, field, field)
info ( ???, field)
Saya mencoba memutuskan apakah saya harus membuat kunci utama info
gabungan ID dari table_1
dan table_2
. Jika saya melakukan ini, manakah di antara ini yang paling masuk akal?
(dalam contoh ini saya menggabungkan ID 11209 dengan ID 437)
INT(9)
11209437 (saya bisa membayangkan mengapa ini buruk)
VARCHAR (10)
11209-437
DECIMAL (10,4)
11209.437
Atau sesuatu yang lain?
Apakah ini baik-baik saja untuk menggunakan ini sebagai Kunci Utama pada MYSQL MYISAM DB?
Jawaban:
Saya akan menggunakan kunci komposit (multi-kolom).
Dengan cara ini Anda dapat memiliki t1ID dan t2ID sebagai kunci asing yang menunjuk ke tabel masing-masing juga.
sumber
UPDATE info ... WHERE t1ID=11209 AND t2ID=437
?Saya tidak akan membuat kunci utama tabel "info" sebagai gabungan dari dua nilai dari tabel lain.
Yang lain dapat mengartikulasikan alasan dengan lebih baik, tetapi rasanya salah memiliki kolom yang terdiri dari dua bagian informasi. Bagaimana jika Anda ingin mengurutkan ID dari tabel kedua karena beberapa alasan? Bagaimana jika Anda ingin menghitung berapa kali nilai dari salah satu tabel hadir?
Saya akan selalu menyimpan ini sebagai dua kolom berbeda. Anda dapat menggunakan kunci utama dua kolom di mysql ... KUNCI UTAMA (id_a, id_b) ... tapi saya lebih suka menggunakan indeks unik dua kolom, dan memiliki bidang kunci primer kenaikan otomatis.
sumber
sintaksnya
CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3)
misalnya ::CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
contoh di atas akan berfungsi jika Anda menulisnya saat Anda membuat tabel misalnya:
untuk menambahkan batasan ini ke tabel yang sudah ada, Anda harus mengikuti sintaks berikut
sumber
Misalkan Anda telah membuat tabel sekarang Anda dapat menggunakan kueri ini untuk membuat kunci primer komposit
sumber
Selain preferensi desain pribadi, ada beberapa kasus di mana seseorang ingin menggunakan kunci primer komposit. Tabel mungkin memiliki dua atau lebih bidang yang memberikan kombinasi unik, dan tidak harus dengan kunci asing.
Sebagai contoh, setiap negara bagian AS memiliki satu set distrik Kongres yang unik. Sementara banyak negara bagian secara individual memiliki CD-5, tidak akan pernah ada lebih dari satu CD-5 di 50 negara bagian, dan sebaliknya. Oleh karena itu, membuat bidang autonumber untuk Massachusetts CD-5 akan menjadi berlebihan.
Jika database menggerakkan halaman web yang dinamis, menulis kode ke kueri pada kombinasi dua bidang bisa jauh lebih sederhana daripada mengekstraksi / mengirim ulang kunci autonumbered.
Jadi, sementara saya tidak menjawab pertanyaan awal, saya tentu menghargai jawaban langsung Adam.
sumber
Kunci primer gabungan adalah apa yang Anda inginkan di mana Anda ingin membuat hubungan banyak ke banyak dengan tabel fakta. Misalnya, Anda mungkin memiliki paket sewa liburan yang menyertakan sejumlah properti di dalamnya. Di sisi lain, properti juga dapat tersedia sebagai bagian dari sejumlah paket sewa, baik sendiri atau dengan properti lainnya. Dalam skenario ini, Anda membangun hubungan antara properti dan paket sewa dengan tabel fakta properti / paket. Hubungan antara properti dan paket akan unik, Anda hanya akan bergabung menggunakan property_id dengan tabel properti dan / atau package_id dengan tabel paket. Setiap hubungan unik dan kunci auto_increment redundan karena tidak akan ditampilkan di tabel lain. Oleh karena itu mendefinisikan kunci komposit adalah jawabannya.
sumber
sumber
@AlexCuse Saya ingin menambahkan ini sebagai komentar untuk jawaban Anda tetapi menyerah setelah beberapa kali gagal mencoba menambahkan baris baru dalam komentar.
Yang mengatakan, t1ID unik di table_1 tapi itu tidak membuatnya unik di tabel INFO juga.
Sebagai contoh:
Table_1 memiliki:
Id Field
1 A
2 B
Table_2 memiliki:
Id Field
1 X
2 Y
INFO kemudian dapat memiliki:
t1ID t2ID bidang
1 1 beberapa
1 2 data
2 1 masing-masing
2 2 baris
Jadi dalam tabel INFO untuk mengidentifikasi baris secara unik Anda membutuhkan t1ID dan t2ID
sumber