Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Perbarui nilai kunci utama menggunakan kerangka kerja entitas

Saya memiliki gelar Ph.D. di cs - di bidang Database, jadi jawaban ini akan sedikit berbeda dari perspektif programmer. Dengan segala hormat kepada Oliver Hanappi, sebuah kunci dapat dan kadang-kadang berubah jika itu bukan kunci pengganti. Misalnya. Kunci alami atau kunci komposit. Sebagai contoh. Dimungkinkan untuk mengubah SSN Anda di AS. Tetapi banyak programmer selama bertahun-tahun akan menganggap ini sebagai kunci yang tidak dapat diubah dan menggunakannya seperti itu. Jauh lebih umum untuk mengubah kunci primer komposit yang terdiri dari kunci asing.

Saya berurusan dengan database yang memiliki hubungan ternary. Khususnya tiga entitas (dengan kunci asing menjadi kunci utama pengganti di tabel masing-masing). Namun, untuk mempertahankan hubungan antara dua entitas saat mengubah entitas ketiga memerlukan mengubah bagian dari tabel persimpangan (juga disebut tabel gabungan murni pada MSDN) kunci utama. Ini adalah desain yang valid dan hanya dapat ditingkatkan dengan menghapus tabel persimpangan hubungan ternary dan menggantinya dengan dua tabel hubungan biner (yang mungkin memiliki kunci penggantinya sendiri). EF akan menangani ini dengan baik. Perubahan desain ini akan membuat model (Banyak->banyak)->banyak atau Parent1-Parent2 -> Child-cucu (jika tidak jelas baca contoh di bawah). Kerangka kerja entitas akan bekerja dengan baik dengan ini karena setiap hubungan benar-benar merupakan hubungan satu ke banyak. Tapi ini desain gila dari perspektif DB. Mari saya tunjukkan contoh alasannya.

Pertimbangkan bahwa Kursus, Kelas, dan Instruktur terkait satu sama lain dalam sebuah kelas. Kelas dapat mencakup:CourseID, ClassroomID, InstructorID sebagai kunci asing dan berisi kunci utama gabungan termasuk ketiganya. Meskipun model ternary yang jelas dan ringkas (hubungan 3 arah) kita dapat memecahnya menjadi hubungan biner. Ini akan memberikan dua tabel persimpangan. Menambahkan kunci pengganti akan memenuhi EF sebagai berikut:

Kelas(KelasKeyPengganti , ID Instruktur , ID Kursus )

ClassRoomUsed(PenggantiKeyClassroomUsed , Kelas Kunci Pengganti , ClassRoomID )

Masalah dengan desain ini adalah bahwa kita dapat memiliki kursus dan instruktur yang sama terkait beberapa kali, yang dihindari oleh model sebelumnya. Untuk menghindari masalah ini, Anda dapat menambahkan batasan dalam database untuk keunikan dua bidang ID, tetapi mengapa Anda ingin melakukan ini ketika Anda hanya berurusan dengan kunci pengganti untuk memulai? Namun solusi ini akan bekerja sebaik yang saya tahu. Namun ini bukan desain basis data logika karena batasan unik yang tidak wajar yang diperlukan dalam DB.

TETAPI, jika Anda tidak ingin mengubah database atau tidak dapat mengubah database, berikut adalah solusi kedua :Tabel persimpangan/asosiasi hanya itu, tautan yang menghubungkan dua entitas atau lebih bersama-sama. Jika salah satu berubah, hapus asosiasi dan buat ulang yang baru yang memiliki kunci asing yang sesuai (properti navigasi). Itu berarti bahwa Anda tidak akan diizinkan untuk meminta entitas anak di salah satu hubungan, tetapi itu sangat umum.

Saya menyarankan agar Kerangka Entitas (di masa depan) memungkinkan kita yang dapat mendesain model DB yang elegan untuk mengubah bagian kunci di tabel persimpangan/asosiasi saat kita mau!

Contoh lain gratis:

Pertimbangkan Asosiasi Siswa, Kursus, Kelas. Siswa dikaitkan dengan kursus melalui nilai. Biasanya ini adalah hubungan banyak ke banyak antara Siswa dan Kursus dengan bidang tambahan di tabel asosiasi yang disebut grade (tabel asosiasi memiliki data muatan seperti grade, tabel persimpangan tidak memiliki muatan dan dirujuk di MSDN sebagai tabel gabungan murni di sewa di satu tempat):

Siswa(ID Siswa , ....)

Kursus(ID Kursus , ...)

Mengambil(StudentID , ID Kursus , nilai)

Jika seseorang membuat kesalahan entri data dari dropdown dan menempatkan siswa di kelas yang salah, Anda ingin mereka mengubahnya nanti dengan memilih dropdown lagi dan memilih kursus yang berbeda. Di latar belakang, Anda perlu menghapus objek EF dari tabel Mengambil dan membuatnya kembali tanpa kehilangan nilai jika ada. Cukup ubah Kunci Asing CourseID sepertinya alternatif yang lebih baik. Buat asosiasi Anda sendiri jika yang ini tampaknya dibuat-buat, tetapi sebagai seorang profesor itu wajar bagi saya.

Kesimpulan:Ketika Anda memiliki serangkaian hubungan, mungkin lebih baik untuk tidak mengizinkan cascading dan/atau mengubah FK, tetapi ada skenario resonable/logis yang diperlukan, bahkan jika tidak direkomendasikan sebagai praktik terbaik di umum .

Masalah ini dapat muncul dengan sendirinya dengan Pengecualian berikut tergantung pada apakah Anda mengubah properti navigasi atau properti kunci dalam model masing-masing:

Terjadi pelanggaran batasan integritas referensial:Properti kunci utama yang merupakan bagian dari batasan integritas referensial tidak dapat diubah ketika objek dependen tidak diubah kecuali jika disetel ke objek utama asosiasi. Objek utama harus dilacak dan tidak ditandai untuk dihapus.

Properti 'X' adalah bagian dari informasi kunci objek dan tidak dapat diubah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sql Server - terhubung dengan otentikasi windows

  2. SQL Server:Kegagalan tautan komunikasi Diperlukan SSL (gagal menerima paket)

  3. Pertumbuhan Ukuran Database SQL Server menggunakan riwayat Cadangan

  4. Periksa apakah ada file atau tidak di sql server?

  5. Periksa Apakah Tabel Memiliki Kolom TIMESTAMP di SQL Server dengan OBJECTPROPERTY()