PENDAHULUAN DAN INFORMASI YANG RELEVAN:
Contoh berikut menggambarkan masalah yang saya hadapi:
Hewan memiliki ras, yang bisa berupa kucing atau anjing . Kucing dapat berupa Siam atau Persia . Anjing bisa menjadi gembala Jerman atau Labrador retriver .
Hewan adalah entitas yang kuat, sementara rasnya adalah atribut yang dapat memiliki salah satu dari dua nilai yang ditawarkan (kucing atau anjing). Kedua nilai ini kompleks (saya telah menambahkan di sini hanya jenis anjing / kucing untuk menggambarkan masalah, tetapi bisa juga ada nama kucing / anjing dan banyak hal lainnya).
MASALAH:
Saya tidak tahu cara membuat tabel relasional untuk contoh ini.
UPAYA SAYA UNTUK MEMECAHKAN MASALAH:
Saya telah mencoba menggambar diagram ER, menggunakan notasi Chen, yang merepresentasikan masalah tetapi sebagai seorang pemula saya tidak tahu apakah saya melakukannya dengan benar. Inilah yang saya dapatkan:
Saya minta maaf jika saya melakukan kesalahan, mohon perbaiki jika itu masalahnya. Saya tidak ingin hanya mendapatkan "solusi gratis" tetapi juga belajar bagaimana menangani masalah ini sehingga saya dapat menyelesaikannya sendiri di masa depan.
Satu-satunya hal yang terlintas di pikiran saya adalah membuat dua tabel terpisah, satu untuk kucing dan satu untuk anjing. Juga, atribut ras dalam tabel Animal hanya akan menyimpan nilai kucing atau anjing . Sesuatu seperti ini:
Animal< # Animal_ID, race, other attributes >
Cat < # Cat_ID, $ Animal_ID, breed >
Dog < # Dog_ID, $ Animal_ID, breed >
Saya benar-benar memiliki perasaan buruk tentang solusi saya dan saya khawatir itu salah, maka pertanyaan di bawah ini.
PERTANYAAN:
- Bagaimana saya bisa mengubah contoh saya menjadi diagram ER?
- Bagaimana cara mengubah diagram ER menjadi tabel relasional?
Jika info lebih lanjut diperlukan tinggalkan komentar dan saya akan memperbarui posting saya sesegera mungkin. Juga merasa bebas untuk menambahkan tag yang sesuai karena saya cukup baru di sini.
Terima kasih.
sumber
Jawaban:
Struktur yang tepat untuk skenario ini adalah model SubClass / Inheritance, dan hampir identik dengan konsep yang saya usulkan dalam jawaban ini: Daftar nilai yang diurutkan secara heterogen .
Model yang diajukan dalam pertanyaan ini sebenarnya cukup dekat karena
Animal
entitas berisi tipe (yaiturace
) dan properti yang umum di semua tipe. Namun, ada dua perubahan kecil yang diperlukan:Hapus bidang Cat_ID dan Dog_ID dari entitasnya masing-masing:
Konsep kunci di sini adalah bahwa segala sesuatu adalah
Animal
, terlepas darirace
:Cat
,Dog
,Elephant
, dan sebagainya. Mengingat titik awal itu, setiap bagianrace
dariAnimal
tidak benar-benar memerlukan pengidentifikasi terpisah karena:Animal_ID
unikCat
,Dog
, dan setiap tambahanrace
entitas ditambahkan di masa depan tidak, dengan sendirinya, sepenuhnya mewakili tertentuAnimal
; mereka hanya memiliki makna ketika digunakan dalam kombinasi dengan informasi yang terkandung dalam entitas indukAnimal
,.Oleh karena itu,
Animal_ID
properti diCat
,Dog
, dll entitas adalah baik PK dan kembali FK keAnimal
entitas.Bedakan antara jenis
breed
:Hanya karena dua properti memiliki nama yang sama tidak selalu berarti bahwa properti itu sama, bahkan jika nama yang sama menyiratkan hubungan seperti itu. Dalam hal ini, apa yang sebenarnya Anda miliki sebenarnya
CatBreed
danDogBreed
sebagai "tipe" terpisahCatatan Awal
VARCHAR
tetapi jika Anda perlu menyimpan sesuatu di luar set ASCII standar, Anda harus benar-benar menggunakannyaNVARCHAR
.Race
,,CatBreed
danDogBreed
) tidak bertambah secara otomatis (yaitu IDENTITAS dalam hal T-SQL) karena mereka adalah konstanta aplikasi (yaitu mereka adalah bagian dari aplikasi) yang merupakan nilai pencarian statis di database dan direpresentasikan sebagaienum
s di C # (atau bahasa lainnya). Jika nilai ditambahkan, mereka ditambahkan dalam situasi terkontrol. Saya mencadangkan penggunaan bidang penambahan otomatis untuk data pengguna yang masuk melalui aplikasi."Breed" sebagai "Race" -Pendekatan Khusus
Kumpulan tabel pertama ini adalah tabel lookup / types:
Daftar kedua ini adalah entitas "Hewan" utama:
Seperangkat tabel ketiga ini adalah entitas sub-kelas gratis yang melengkapi definisi masing
Race
- masingAnimal
:Model menggunakan
breed
tipe bersama ditampilkan setelah bagian "Catatan Tambahan".catatan tambahan
breed
tampaknya menjadi titik fokus untuk kebingungan. Itu disarankan oleh jcolebrand (dalam komentar pada pertanyaan) yangbreed
merupakan properti yang dibagikan di antara yang berbedarace
, dan dua jawaban lainnya memilikinya terintegrasi seperti dalam model mereka. Namun, ini merupakan kesalahan, karena nilai untukbreed
tidak dibagi di antara nilai yang berbeda darirace
. Ya, saya menyadari bahwa dua model lain yang diusulkan berupaya menyelesaikan masalah ini dengan menjadikannyarace
sebagai indukbreed
. Sementara itu secara teknis memecahkan masalah hubungan, itu tidak membantu memecahkan pertanyaan pemodelan keseluruhan tentang apa yang harus dilakukan tentang properti yang tidak umum, atau bagaimana menanganirace
yang tidak memiliki abreed
. Tapi, dalam hal properti seperti itu dijamin ada di semuaAnimal
s, saya akan menyertakan opsi untuk itu juga (di bawah).Animal
), ataurace
disimpan dalamAnimal
entitas yang merupakan cara yang sangat datar (dan hampir non-relasional) untuk mewakili data ini. Ya, orang melakukan ini sepanjang waktu, tetapi itu artinya memiliki banyak bidang NULL per baris untuk properti yang tidak dimaksudkan untuk bidang tertentu tersebutrace
DAN mengetahui bidang mana per baris yang terkait dengan catatan tertenturace
.race
dariAnimal
dalam waktu yang tidak memilikibreed
sebagai properti. Dan bahkan jika SEMUAAnimal
memilikibreed
, itu tidak akan mengubah struktur karena apa yang telah dicatat sebelumnyabreed
: yangbreed
bergantung padarace
(yaitubreed
untukCat
bukan hal yang sama sepertibreed
untukDog
)."Breed" sebagai Pendekatan Properti Bersama / Bersama
Tolong dicatat:
SQL di bawah ini dapat dijalankan dalam database yang sama dengan model yang disajikan di atas:
Race
meja adalah samaBreed
tabel baruAnimal
tabel telah ditambahkan dengan2
Breed
menjadi properti yang sekarang umum, tampaknya tidak benar untuk tidakRace
mencatat dalam entitas induk / induk (meskipun secara teknis benar secara relasional). Jadi, keduanyaRaceID
danBreedID
diwakili dalamAnimal2
. Untuk mencegah ketidaksesuaian antara yangRaceID
dicatat dalamAnimal2
danBreedID
yang berbedaRaceID
, saya telah menambahkan FK pada keduanyaRaceID, BreedID
yang merujuk KONSTRA UNIK dari bidang-bidang dalamBreed
tabel. Saya biasanya membenci menunjuk seorang FK ke CONSTRAINT UNIK, tetapi di sini adalah salah satu dari beberapa alasan yang sah untuk melakukannya. KONSTRA UNIK secara logis merupakan "Kunci Alternatif", yang membuatnya valid untuk penggunaan ini. Harap perhatikan juga bahwaBreed
tabel masih memiliki PK hanyaBreedID
.BreedID
diulang di berbagai nilaiRaceID
.BreedID
, jadi masih mungkin untuk referensi nilai tertentuBreed
tanpa memiliki yangRaceID
tersedia.Breed
(dan itulah sebabnya saya lebih suka tabelRace
-specificBreed
).Breed
memiliki sifat yang sama. Tidak ada cara mudah dalam model ini untuk memiliki sifat yang berbeda antaraDog
"breed" danElephant
"breed". Namun, masih ada cara untuk melakukan ini, yang dicatat di bagian "Edit Akhir".Breed
lebih dari satu ras. Saya tidak yakin apakah itu diinginkan untuk dilakukan (atau mungkin tidak dalam konsep hewan tetapi mungkin dalam situasi lain yang akan menggunakan model jenis ini), tetapi tidak mungkin di sini.Sunting Akhir (semoga ;-)
Breed
, adalah mungkin untuk menggunakan konsep subclass / warisan yang sama tetapi denganBreed
sebagai entitas utama. Dalam pengaturan iniBreed
tabel akan memiliki sifat-sifat yang umum untuk semua jenisBreed
(sepertiAnimal
tabel) danRaceID
akan mewakili jenisBreed
(sama seperti halnya dalamAnimal
tabel). Maka Anda akan memiliki tabel subclass sepertiBreedCat
,BreedDog
, dan sebagainya. Untuk proyek yang lebih kecil ini mungkin dianggap "rekayasa berlebihan", tetapi sedang disebutkan sebagai pilihan untuk situasi yang akan mendapat manfaat dari itu.Untuk kedua pendekatan, terkadang membantu untuk membuat Tampilan sebagai jalan pintas ke entitas penuh. Sebagai contoh, pertimbangkan:
CreatedDate
lapangan akan ditambahkan keAnimal
meja. Bidang ini tidak diperlukan dalam tabel subkelas mana pun (misalnyaAnimalCat
) karena baris yang dimasukkan untuk kedua tabel harus dilakukan pada waktu yang sama dalam suatu transaksi.LastModifiedDate
lapangan akan ditambahkan keAnimal
meja dan semua tabel subclass. Bidang ini akan diperbarui hanya jika tabel tertentu diperbarui: jika pembaruan terjadiAnimalCat
tetapi tidak dalamAnimal
untuk tertentuAnimalID
, maka hanyaLastModifiedDate
bidang yangAnimalCat
akan ditetapkan.sumber
D
, oleh karena itu saya ingin menerapkan metode dari jawaban Anda. Dua entitas memiliki atribut umumE
yang tidak ada pada entitas ketiga. Haruskah saya mengabaikan fakta ini dan menerapkan solusi standar, atau adakah cara untuk lebih mengoptimalkan desain saya?Pertama, Anda melakukannya dengan baik untuk membedakan antara pemodelan ER dan pemodelan relasional. Banyak pemula tidak.
Berikut adalah beberapa kata kunci yang dapat Anda gunakan untuk mencari artikel bermanfaat di web.
Kasing Anda adalah kasing klasik kelas / subkelas atau, jika Anda suka, ketik / subtipe.
Ungkapan yang digunakan dalam pemodelan ER adalah "generalisasi / spesialisasi". Dan banyak artikel menunjukkan ini di bawah sesuatu yang disebut pemodelan EER (Enhanced Entity-Relationship). Ini bukan dalam presentasi asli pemodelan ER dari Peter Chen. Itu ditambahkan kemudian. Untuk ringkasan gen / spek yang cukup bagus dalam bentuk pdf, klik di sini
Selanjutnya, saat mengonversi case kelas / subclass ke pemodelan relasional Anda mendesain tabel. Ada lebih dari satu pendekatan. Dua pendekatan utama disebut pewarisan tabel tunggal dan warisan tabel kelas. Masing-masing memiliki kelebihan dan kekurangan. Presentasi terbaik dari kedua desain ini berasal dari Martin Fowler. Anda dapat melihat garis besarnya di sini dan di sini .
Keuntungan besar dari pewarisan tabel tunggal adalah kesederhanaan. Semuanya disimpan dalam satu tabel. Kerugian besar adalah banyak NULLS. Ini dapat membuang-buang ruang dan waktu dan menghasilkan logika yang membingungkan.
Warisan tabel kelas membutuhkan gabungan, tetapi sederhana dan cepat. Terutama jika Anda menggunakan teknik yang disebut kunci primer bersama, di mana PK dalam tabel subkelas adalah salinan PK dalam tabel superclass. Anda dapat membuat tampilan untuk setiap subclass yang bergabung dengan data superclass dengan data subclass.
Terakhir, ada tag di area ini yang mengumpulkan pertanyaan seperti pertanyaan Anda bersama.
Ini dia: subtipe
sumber
Saya melihat kemungkinan desain sebagai
Meja
Race
Meja
Breed
Meja
Animal
PK ini di atas akan menjadi kolom penambahan otomatis. Kolom lain dalam
Animal
tabel dapat dinamai sesuai.sumber
Metode Anda saat ini tidak buruk. Namun, jika Anda akan menambahkan lebih banyak balapan nanti (burung, ikan, dll.) Maka membuat tabel terpisah untuk masing-masing bisa menjadi rumit. Saya akan merekomendasikan sesuatu seperti berikut:
Seekor ras, menurut pemahaman saya, seharusnya hanya memiliki satu ras. Jadi, jika Anda menyimpan breed di tabel Animal Anda akan dapat menentukan ras dengan bergabung ke tabel Breed. Jelas, tambahkan atribut lain (nama, deskripsi, dll.) Ke tabel Breed dan Race sesuai kebutuhan.
sumber