Bagaimana saya harus memodelkan hubungan "baik / atau"?

12

Katakanlah saya memiliki entitas bernama Perangkat Lunak dan dua sub-jenis FreeSoftware dan NonFreeSoftware. Entitas NonFreeSoftware memiliki atribut seperti tanggal pembelian, vendor, dll. Entitas FreeSoftware memiliki atribut seperti lisensi, url kode sumber, dll.

Jadi jika saya ingin memodelkan entitas lain, OperatingSystem, bagaimana saya harus melakukannya? Ada hubungan "adalah" dengan Perangkat Lunak tetapi hubungan "baik / atau" dengan FreeSoftware dan NonFreeSoftware.

Saya pikir saya kehilangan sesuatu dalam cara saya menganalisis hierarki ini.

jl6
sumber
Tinjau jawaban ini . Ini mencakup rincian implementasi pemodelan hubungan semacam ini.
Nick Chammas

Jawaban:

8

Cara untuk mengelola ini adalah bahwa sub-tipe Anda harus ditentukan oleh tipe-super (yaitu PK dari sub-tipe juga merupakan FK dari sub-tipe ke tipe-super.)

Tantangannya adalah memahami apakah sesuatu itu benar-benar eksklusif atau tidak. Atribut-atribut dari sub-tipe seharusnya hanya berlaku untuk sub-tipe tersebut, tetapi mungkin saja bahwa beberapa sub-tipe tersebut saling eksklusif dan beberapa tidak.

Jika Anda memiliki beberapa sub-tipe yang saling eksklusif, maka Anda dapat menggunakan atribut partisi pada tipe super untuk menunjukkan yang mana dari (dua atau lebih) sub-jenis yang saling eksklusif berlaku. Atribut partisi ini dapat digunakan dengan kendala atau pemicu untuk menegakkan eksklusivitas mutual.

Jika Anda memiliki sub-tipe yang tidak saling eksklusif, maka mereka dapat ada tanpa menggunakan atribut partisi apa pun.

Pertimbangkan model data ini:

ERD

Anda memiliki tiga tipe super, tetapi FREE_SOFTWAREdan NON-FREE_SOFTWAREtipe saling eksklusif, berdasarkan SOFTWARE.free_not_freeatribut partisi flag. Setiap perangkat lunak yang diberikan juga berpotensi OPERATING_SYSTEM, terlepas dari apakah itu gratis atau tidak.

Joel Brown
sumber
1
Sedikit Sl: apa yang Anda gunakan untuk membuat diagram ER ini?
Daniel Serodio
@DanielSerodio - Saya menggunakan Visio dengan bentuk cerdas yang saya buat sendiri berdasarkan notasi James Martin ERD. Bentuknya menggunakan tekstur garis khusus untuk memberi mereka penampilan informal, yang menurut saya sangat membantu dalam mengingatkan orang ketika diagram adalah "sketsa" atau rancangan desain.
Joel Brown
@ JoelBrown Apakah Anda bersedia membagikan stensil Anda? Ini adalah bentuk yang sangat bagus
imoatama
2
@imoatama - Sudah lama, tapi akhirnya saya sempat memposting stensil di sini: moosewarevisioerd.codeplex.com Perhatikan seperti pada deskripsi bahwa bentuk cerdas stensil dibuat untuk versi Visio yang lebih lama dan beberapa perilaku dari bentuk konektor hubungan bisa sedikit flakey. Suatu hari saya akan memperbaiki ini.
Joel Brown
1

Mengapa OperatingSystem menjadi entitas yang sepenuhnya baru? Itu harus berada di bawah Perangkat Lunak satu, karena memang seperti itu. Dan OS (jika sumber tertutup) akan memiliki tanggal pembelian, vendor, dll. Dan OS open source akan memiliki lisensi, URL kode sumber, dll.

Saya akan merekomendasikan hubungan dengan SoftwareTypeatau sesuatu di sepanjang garis itu. Saat itulah Anda dapat / harus menentukan apakah Perangkat Lunak adalah OS, atau aplikasi, atau jenis perangkat lunak apa pun yang Anda dukung.

Thomas Stringer
sumber
Saya ingin OperatingSystem menjadi entitas yang terpisah karena merupakan spesialisasi Perangkat Lunak. Ini mungkin memiliki atribut yang tidak akan dimiliki oleh Perangkat Lunak lain (seperti tipe kernel, flag RTOS-or-not, flag multiuser, dll.).
jl6
1
@ jl6 Saya masih memohon berbeda di sini. Setiap perangkat lunak (baik itu OS atau tidak) akan memiliki atribut spesifik. Itu bisa disimpan di tempat lain. Anda meminimalkan skalabilitas dengan memisahkan OS.
Thomas Stringer
Jika saya mengerti dengan benar, Anda merekomendasikan entitas Software, dan entitas SoftwareType. Apakah Anda mengatakan Free, NonFree, dan OperatingSystem semuanya merupakan contoh berbeda dari SoftwareType? Saya yakin Anda benar, tetapi kemudian di mana Anda menyimpan berbagai atribut dari jenis yang berbeda?
jl6