Apa keuntungan yang kita miliki saat membuat tabel pemetaan terpisah untuk dua tabel relasional

9

Dalam berbagai CMS open source, saya perhatikan ada tabel terpisah untuk memetakan dua tabel relasional. Seperti untuk kategori dan produk, ada product_category_mappingtabel terpisah . Tabel ini hanya memiliki kunci utama dan dua kunci asing dari kategori dan tabel produk.

Pertanyaan saya adalah apa manfaat dari desain database ini daripada hanya menghubungkan tabel secara langsung dengan mendefinisikan kunci asing di kedua tabel? Apakah hanya masalah kenyamanan?

Pankaj Upadhyay
sumber

Jawaban:

7

Tabel seperti itu sering disebut sebagai tabel tautan atau tabel jembatan .

Ini adalah cara standar untuk menciptakan hubungan banyak-ke-banyak. Dengan kunci asing langsung antara dua tabel, Anda hanya dapat membuat hubungan satu-ke-banyak (karena kunci utama yang titik kunci asing tunjukkan juga merupakan kendala unik), atau hubungan satu-ke-satu (jika kunci asing itu sendiri juga merupakan kendala unik).

Bergantung pada filosofi desain DB, kolom kunci utama sering ditinggalkan, dan kunci utama dari tabel jembatan terdiri dari dua kolom kunci asing sendiri (bagaimanapun, Anda memerlukan batasan unik pada kolom ini, jadi mengapa tidak membuatnya menjadi kunci utama?).

tammmer
sumber
ohh k .... Jadi singkatnya, Jika saya perlu memiliki hubungan banyak-ke-banyak, seseorang harus mengikuti pendekatan ini, kan ??
Pankaj Upadhyay
1
@PankajUpadhyay: Benar. Hubungan MM harus diimplementasikan dengan cara ini.
NoChance
@PankajUpadhyay: secara teori, Anda dapat menggunakan pendekatan lain, tetapi mereka berantakan dan salah, jadi saya sarankan Anda tidak pernah pergi ke sana.
tdammers
2
@PankajUpadhyay: Jika Anda ingin membuat database Normalisasi, Anda harus menggunakan tabel ke-3 seperti yang dijelaskan. Jika Anda memiliki hubungan 1-M, Anda tentu tidak ingin tabel ke-3. Jika Anda memiliki MM terbatas dan terbatas dan tidak peduli tentang Normalisasi, Anda dapat melakukannya tanpa tabel ke-3. Secara umum, tetap berpegang pada database yang dinormalisasi kecuali jika Anda membangun gudang data atau data mart (dalam kasus seperti itu, skema yang dinormalisasi masih bisa diperdebatkan).
NoChance
@EmmadKareem: ya, saya melihat itu .... Persyaratan saya adalah satu-ke-banyak, jadi saya tidak akan membuat tabel .... Terima kasih sobat
Pankaj Upadhyay
2

Itu cara mudah untuk menerapkan hubungan banyak ke banyak .

Pertimbangkan dua tabel ini:

category
--------
categoryID [PK]
categoryName

product
-------
productID [PK]
productName

Jika Anda menambahkan categoryIDbidang ke product, setiap produk hanya dapat memiliki satu kategori. Tetapi jika kita memiliki yang product_category_mappingseperti ini:

product_category_mapping
------------------------
mappingID [PK]
productID [FK]
categoryID [FK]

maka kita dapat memiliki:

mappingID  productID  categoryID
--------------------------------
1          1          1
2          1          2
3          2          3
4          2          1  

Jadi produk 1 adalah dari kategori 1 & 2 dan produk 2 dari kategori 3 & 1, begitu banyak produk termasuk dalam banyak kategori, dan banyak kategori memiliki banyak produk.

Seperti yang ditulis tdammers , tabel ini sering disebut sebagai tabel tautan atau tabel jembatan, dan saya bahkan pernah melihatnya disebut sebagai tabel HABTM, dari HasAndBelongsToMany yang rupanya Ruby on Rails berbicara bagi banyak orang. Dan Wikipedia menyebutnya tabel persimpangan dan memiliki beberapa nama lagi untuk itu.

yannis
sumber
Ini bukan hanya Rails-speak, hampir semua kerangka PHP yang saya gunakan menyebutnya sebagai HABTM.
sevenseacat
@ Kubie Beberapa contoh? Saya tahu CakePHP menggunakan nama HABTM, tapi itu memang dimulai sebagai klon Rails.
yannis
Saya penggemar pengganti. Tapi saya lebih suka untuk meninggalkan kunci pengganti "mappingID" dan menempatkan PK komposit pada "productID" dan "categoryID". Dalam pikiran saya kunci komposit yang terdiri dari 2 pengganti adalah pengganti dalam hak itu sendiri. Anda tidak akan pernah benar-benar menggunakan pengganti "mappingID" di setiap bergabung.
Lord Tydus
@ LordTydus Saya tidak menulis kunci komposit seperti yang dilakukan tdammers, tidak ada gunanya mendaur ulang jawabannya. Tetapi ada kegunaan mappingIDkunci yang valid , satu skenario umum adalah untuk lebih baik melacak impor / ekspor besar-besaran di mana tabel persimpangan memegang banyak kunci asing.
yannis
2

Alasan untuk menggunakan tabel pemetaan adalah untuk menghilangkan duplikasi. Silakan dan coba beberapa teknik pemetaan lainnya. Anda tidak akan dapat mencegah duplikat data tanpanya.

Dan itu membawa pertanyaan 2cd. Mengapa repot-repot menghilangkan duplikasi? Jadi, Anda hanya perlu mengedit data 1 kali di 1 tempat. Terkadang ada hukuman kinerja untuk menghilangkan duplikasi. Di lain waktu ada PENINGKATAN kinerja untuk menghilangkan duplikasi. Misalnya, lebih cepat mengisi daftar drop-down dengan nilai pencarian yang dinormalisasi, daripada memilih nilai duplikat yang berbeda dalam tabel besar.

Tuan Tydus
sumber