Mendapatkan beberapa proyek dimulai dengan EF, tapi aku punya beberapa pertanyaan tentang bergabung meja dan kunci dll Katakanlah saya punya tabel aplikasi dan meja perizinan. Aplikasi memiliki banyak izin dan setiap izin dapat menjadi milik banyak aplikasi (banyak-ke-banyak).
Sekarang, tabel Aplikasi dan Izin mudah:
Applications
--------------
PK ApplicationID
Name
Permissions
--------------
PK PermissionID
Name
Tapi apa cara TERBAIK untuk melakukan tabel bergabung? Saya punya dua opsi ini:
ApplicationPermissions
-----------------------
PK ApplicationPermissionID
CU ApplicationID
CU PermissionID
ATAU
ApplicationPermissions
-----------------------
CPK ApplicationID
CPK PermissionID
PK = Primary Key
CPK = Composite Primary Key
CU = Composite Unique Index
Pernahkah Anda dibakar melakukannya satu arah dari yang lain? apakah ini semata-mata preferensi? Terpikir oleh saya bahwa banyak "perbedaan" akan diabstraksi oleh pola repositori saya (misalnya, saya hampir tidak akan pernah membuat seluruh objek izin dan menambahkannya ke aplikasi, tetapi melakukannya dengan ID atau nama unik atau sesuatu), tapi kurasa aku sedang mencari cerita horor, entah bagaimana.
sumber
Selama bertahun-tahun saya terbiasa memberi setiap tabel "TableName" kunci primer otomatis yang dihasilkan "TableNameID", tanpa pengecualian, bahkan untuk tabel persimpangan. Saya dapat mengatakan saya tidak pernah menyesalinya, karena itu membuat banyak hal lebih mudah ketika membuat kode generik yang melakukan sesuatu untuk "semua tabel" atau "beberapa tabel", atau untuk "banyak baris dari beberapa tabel yang berbeda".
Misalnya, jika seseorang meminta Anda untuk menyimpan beberapa baris tabel yang berbeda (atau referensi ke mereka) dalam file atau dalam memori, misalnya, untuk keperluan logging, sangat berguna ketika Anda tahu sebelumnya bahwa Anda hanya perlu menyimpan satu saja nama tabel & persis satu ID integer, dan Anda tidak harus berurusan dengan "kasus khusus".
Hal lain, ketika Anda mulai dengan PK gabungan, Anda mungkin akan beberapa kali kemudian bertemu dengan kebutuhan untuk kunci asing gabungan (karena Anda mungkin sampai pada titik di mana Anda ingin menambahkan referensi FK ke
ApplicationPermissions
meja Anda ). Maka persyaratan berikutnya mungkin untuk memiliki FK ini menjadi unik dalam hubungannya dengan atribut lain atau kunci asing - yang akan menghasilkan peningkatan kompleksitas secara keseluruhan. Tidak ada yang tidak mungkin ditangani untuk sebagian besar sistem DB modern, tentu saja, tetapi solusi yang seragam membuat hidup para programmer seringkali jauh lebih mudah.Dan akhirnya, pernyataan seperti
SELECT ... FROM TABLE WHERE TableNameID IN (id1,id2,...)
berfungsi dengan baik dengan satu kolom sebagai kunci utama, tapi saya belum pernah melihat dialek SQL sejauh ini yang memungkinkan Anda melakukan ini dengan tombol gabungan. Jika Anda tahu sebelumnya bahwa Anda tidak akan pernah membutuhkan pertanyaan seperti ini, baiklah, tetapi jangan kaget jika besok Anda mendapatkan persyaratan yang akan paling mudah diselesaikan dengan SQL jenis ini.Tentu saja, ketika Anda mengharapkan
ApplicationPermissions
meja Anda menampung beberapa ratus juta baris, maka Anda harus mempertimbangkan untuk menghindari sesuatu seperti aApplicationPermissionsID
.sumber
Meskipun jawaban Mike baik, berikut adalah alasan saya akan menambahkan bidang ID terpisah atau tidak.
Pertimbangkan untuk menggunakan bidang ID terpisah untuk tabel persimpangan / gabung jika berisi bidang selain ID . Ini cenderung mencatat bahwa itu adalah entitas kelas satu.
Pertimbangkan untuk menggunakan bidang ID terpisah jika API atau logika apa pun yang ada cenderung menggunakan bidang tunggal untuk mengambil / mengedit entitas. Itu dapat membantu orang lain mengikuti kode Anda dalam konteks proyek yang lebih besar.
Jangan menggunakannya jika tidak ada manfaat khusus (KISS). EF tahu bagaimana menangani jenis tabel ini dan batasan unik komposit terkadang dapat dilewatkan ketika orang lain mencoba memahami jenis hubungan ini. Juga, ketika normalisasi saya mencoba menggunakan kunci sekecil mungkin yang secara unik mendefinisikan tuple . Dalam contoh kedua Anda, Anda secara efektif memiliki 2 kunci utama kandidat yang terpisah.
sumber
Ingatlah untuk membuat indeks dan kunci asing pada keduanya
PersonId
danAddressId
.Tidak peduli apa yang orang lain pikirkan "lebih baik" atau "Anda harus", ini adalah cara paling sederhana dan termudah untuk memungkinkan database berfungsi dengan baik.
sumber
PersonAddress
baris dengan nilai yang identikPersonId
danAddressId
.