Berita:

Projek aktif: RPG OJ v0.3
Projek sampingan: Zion TCG, SETH
Projek ditunda: Tales of Another Journey

Main Menu

Diagram-ER

Dimulai oleh Èxsharaèn, 15 Juli 2009, 10:56:13

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

Èxsharaèn

Di artikel Basis Data sudah kujelaskan sedikit tentang diagram-ER. Nah, artikel ini akan mengupas tuntas tentang diagram ini. Seperti apa sih bentuknya? Apa pengaruhnya nanti terhadap basis data kita?

Semua gambar di artikel ini dibuat menggunakan Dia for Windows, pengganti Microsoft Visio (penggambar diagram), yang tentu saja gratis ;) Dia for Windows bisa didapatkan di sini.

Contoh kasus yang akan digunakan adalah contoh kasus stash, yang bisa dibaca di sini.

Kita ulang sebentar pengenalan pada diagram-ER. Apa sih diagram-ER itu? Diagram-ER (ER-nya sendiri adalah Entitas-Relasi) adalah diagram yang menggambarkan hubungan antarentitas. Entitas itu sendiri adalah objek yang muncul pada sistem kita. Bahasa awamnya boleh lah entitas ini disebut tabel, karena memang nantinya entitas ini akan jadi tabel pada basis data kita. Nah, tiap entitas ini tentunya tidak mungkin berdiri sendiri, tapi memiliki relasi satu dengan yang lain. Relasinya lah yang digambarkan pada diagram-ER.

Pertama-tama, mari kita kenalan dengan entitas :D
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#1
Entitas ini sendiri ada dua jenis:

1. Entitas kuat (strong entity)
Sebuah entitas dikatakan kuat jika keberadaannya tidak tergantung pada entitas lainnya. Ilustrasinya begini. Misalkan di suatu lokasi ada Restoran dan Hotel, kita anggap keduanya entitas. Jika tidak ada Restoran, Hotel masih tetap ada. Sebaliknya, Hotel tidak ada pun Restoran masih bisa berdiri sendiri.
Pada diagram-ER, entitas kuat digambarkan dengan sebuah kotak bergaris tunggal:



2. Entitas lemah (weak entity)
Kebalikan entitas kuat, entitas ini bergantung pada sebuah (atau lebih, walaupun yang terakhir ini jarang) entitas kuat. Jika entitas kuatnya tidak ada, entitas lemah ini pun ikut menghilang. Contohnya, misalkan di dalam Hotel tadi ada Kamar. Kalau Hotel-nya tidak ada, bagaimana bisa ada Kamar? ;)
(Note: Contoh klasik anak infor yang bikin bosan adalah seperti berikut: kalau ada Barang yang harganya selalu berubah, pasti akan ada Histori Harga. Histori Harga itu pasti entitas lemah, karena kalau tidak ada Barang, tidak mungkin ada Histori Harga.)
Entitas lemah digambarkan pada diagram-ER dengan kotak bergaris ganda:



Tiap entitas selalu memiliki paling tidak satu atribut, yaitu karakteristik yang menjelaskan entitas tersebut. Atribut ini nantinya akan menjadi nama kolom (field) pada tabel kita, sementara entitasnya sendiri akan jadi satu tabel sendiri.

Nah, sekarang kita tentukan entitas-entitas yang diperlukan dalam contoh kasus di atas. Hasil analisis ini mungkin berbeda satu sama lain, jadi tidak ada jawaban yang mutlak benar atau salah di sini. Jangan khawatir salah pada tahap ini, karena pada tahap berikutnya akan dilakukan pengecekan, sehingga hasil akhirnya akan tetap seoptimal mungkin.

Cara termudah untuk menentukan entitas dan atribut adalah mencari semua kata benda dalam kasus kita. Kelihatan jelas bahwa kita punya Barang dan Faktur Penjualan. Kemudian ada juga Nama Barang, Harga Barang, Stok, Nomor Faktur, Tanggal Faktur, Jumlah Dibeli, Harga Beli, Subtotal, Total Dibeli, dan Grand Total. Bisa tentukan mana entitas dan mana relasi?

Barang: jelas sekali ini entitas.
Faktur Penjualan: entitas juga :)

Atribut milik entitas Barang apa saja? Kelihatan bahwa atributnya adalah Nama Barang, Harga Barang, dan Stok. Sementara itu, Nomor Faktur, Tanggal Faktur, Total Dibeli, dan Grand Total adalah atribut milik Faktur Penjualan? Lha sisanya? Sisanya ternyata adalah atribut relasi antara Barang dan Faktur Penjualan. Lho kok bisa? Nanti akan aku jelaskan kenapa :)

Sekarang kita coba gambar dulu entitas Barang kita, lengkap dengan atributnya. Atribut sendiri ada macam-macam.
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#2
Secara umum, atribut digambarkan dengan garis oval tunggal seperti ini:



Tentu saja jangan lupa hubungkan dengan entitasnya :D

Atribut pertama yang akan kita kenal adalah atribut kunci utama (primary key). Atribut ini wajib dimiliki oleh setiap entitas tanpa kecuali. Kenapa kunci utama begitu penting? Well, setiap data harus unik, artinya kita bisa mengidentifikasi data itu secara tunggal, sekalipun mungkin ada data yang mirip. Contoh! Nama orang banyak yang kembar kan? Untuk mengidentifikasi satu orang saja, maka muncullah nomor KTP yang tidak mungkin sama satu dengan yang lainnya. Nomor KTP inilah kunci utama kita. Atribut kunci utama digambar sama persis, hanya saja namanya diberi garis bawah:

Lurus kalau dia kunci utama milik entitas kuat:



Putus-putus kalau punyanya entitas lemah:



Kemudian, ada atribut turunan (derived). Maksudnya, atribut ini nilainya didapat dari hasil perhitungan. Entitas Barang tidak punya atribut ini, tapi entitas Faktur Penjualan punya. Bisa tebak? :D Pada diagram, entitas ini digambarkan dengan oval bergaris putus-putus:



Terakhir! Ada atribut yang bisa punya banyak nilai (multivalue). Pada contoh kasus kita kebetulan tidak ada. Contoh paling gampang adalah nomor HP. Siapa yang punya nomor HP lebih dari satu :D atribut nilai-banyak ini digambar dengan oval bergaris ganda:



Nah, dengan keterangan tadi, kita sudah bisa menggambar entitas Barang lengkap dengan jenis-jenis atributnya:



Bisa menggambar sendiri milik entitas Faktur Penjualan? Coba gambar sendiri, lalu cocokkan dengan gambar berikut:

[spoiler=Diagram-ER untuk entitas Faktur Penjualan][/spoiler]

Nah, itu baru entitasnya. Relasinya gimana?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#3
Nah, setelah semua entitas dan atributnya jadi, saatnya menghubungkan mereka dengan relasi. Saat menghubungkan, sebisa mungkin hindari rangkaian tertutup agar datanya nggak nyebar ke mana-mana.

Untuk kasus stash, relasinya simpel sekali, yaitu antara Barang dan Faktur Penjualan. Relasi digambarkan dengan sebuah belah ketupat dan garis yang menghubungkan tiap relasi. Contohnya seperti ini:



Sebenarnya ada yang kurang dari gambar ini, karena ada dua hal yang harus diperhatikan. Apa saja itu?

1. Participation Constraint
Ini menunjukkan tingkat partisipasi tiap entitas yang punya relasi. Bahasa gampangnya, apakah semua anggota entitas A berelasi dengan entitas B? Sebaliknya, apakah semua anggota entitas B berelasi dengan entitas A? Nah, dari pertanyaan-pertanyaan ini muncul dua jawaban:

- Partial participation
Ini terjadi jika tidak semua anggota entitas A berelasi dengan entitas B. Pada diagram-ER, partisipasi ini digambarkan dengan garis tunggal.

- Total participation
Sebaliknya, ini terjadi jika semua anggota entitas berelasi dengan entitas B. Gambarnya adalah garis ganda.

Kita ambil contoh saja diagram-ER baru kita di atas tadi. Apa participation constraint-nya sudah betul? Cek saja :D

Apakah semua siswa masuk sekolah? Jelas, bukan siswa namanya kalau tidak masuk sekolah :D jadi, di sisi Siswa, partisipasinya total.
Apakah semua sekolah dimasuki siswa? Ada beragam jawaban sih, tapi kita asumsikan tidak semua sekolah dimasuki siswa, misalkan saja sekolah yang baru saja buka atau memang tidak ada yang minat masuk sana :D jadi, di sisi Sekolah, partisipasinya parsial.

Bisa gambar diagramnya?



Hal kedua yang perlu diperhatikan adalah...

2. Cardinality Ratio
Rasio ini menunjukkan berapa banyak anggota entitas yang berelasi dengan entitas lain. Apakah satu entitas A berelasi dengan satu entitas B? Apakah satu entitas A berelasi dengan banyak entitas B? Atau, apakah banyak entitas A berelasi dengan banyak entitas B? Pada diagram-ER, ketiganya dikenal dengan relasi one-to-one, one-to-many, dan many-to-many. Lambangnya adalah 1-1, 1-N, dan M-N.

Cara menentukan cardinaliti ratio adalah menanyai tiap entitas seperti berikut: Satu entitas A berelasi dengan berapa entitas B: satu atau banyak? Setelah diketahui, letakkan jumlahnya di entitas seberangnya.

Bingung ya? Yuk masuk contoh saja ;)

Dari sisi Siswa:
Satu Siswa masuk di berapa Sekolah? Tentu 1 kan :D letakkan 1 di sisi Sekolah.

Dari sisi Sekolah:
Satu Sekolah dimasuki berapa Siswa? Tentu saja banyak :D letakkan N di sisi Siswa.

Jadilah relasinya N-1. Gambarnya sebagai berikut, dijadikan satu dengan participation constraint:



Ini sebenarnya buat apa sih? Untuk sekarang mungkin belum ada pengaruhnya, tapi di langkah berikutnya (setelah diagram-ER kita jadi), keduanya akan menentukan kolom-kolom tambahan yang mungkin akan dimiliki tiap entitas. Sementara ikuti saja dulu :)

Bisa bikin untuk contoh kasus stash? Coba yuu...

Participation constraint-nya:
Apa semua Barang ada di Faktur Penjualan? Tentu tidak, ada barang yang belum laku terjual kan? Kita dapat Parsial, berarti garis tunggal di sisi Barang.
Apa semua Faktur Penjualan ada Barang-nya? Tentu saja, faktur kosong dong kalau nggak ada isinya ;D kita dapat Total. Garis ganda di sisi Faktur Penjualan.

Cardinality ratio-nya:
Satu Barang ada di berapa Faktur Penjualan? Banyak, tentu saja. Letakkan N di Faktur Penjualan.
Satu Faktur Penjualan ada berapa Barang? Banyak juga kan? Letakkan M di Barang.

Oke! Karena hanya itu relasinya, diagram-ER milik stash jadi sudah. Ditambah dengan atribut relasi, berikut diagram-ER selengkapnya:



Catatan
Ada perkecualian untuk relasi lemah (relasi antara entitas kuat dengan entitas lemah): participation constraint-nya pasti parsial di sisi kuat dan total di sisi lemah, sementara cardinality ratio-nya pasti 1-N (walaupun pada beberapa kasus bisa saja M-N, tapi agak jarang). Kenapa begitu? Well, sesuai dengan sifat entitas lemah yang sepenuhnya tergantung pada entitas kuat sebenarnya. Kita coba contoh antara Hotel dan Kamar (Kamar di sini adalah entitas lemahnya).

Participation constraint:
Apa semua Hotel punya Kamar? Nggak kan? (parsial)
Apa semua Kamar dipunyai Hotel? Iya kan? (total)

Cardinality Ratio:
Satu Hotel punya berapa Kamar? Banyak (N di sisi Kamar)
Satu Kamar dipunyai berapa Hotel? Satu (1 di sisi Hotel)

Terbukti kan :) gambar relasi pun berubah: garisnya ganda seperti terlihat pada gambar berikut:



Selesai! Untuk kasus stash, diagramnya memang sederhana, jadi langkah-langkah yang sudah kita lakukan sejauh ini malah terlihat panjang. Walaupun awalnya berbelit-belit, hasilnya nanti jauh lebih aman daripada dengan mengira-ngira saja.

Sudah siap ke langkah berikutnya? Kita belum selesai sampai di sini, karena itu baru diagramnya saja :D cara pakai diagram ini bagaimana?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Nah, diagram-ER kita sudah jadi. Indah ya bentuknya :D tapi, apa sampai di sini saja fungsi diagram itu? Terus ngapain capek-capek analisis dan nggambar lalu hanya dipandangi saja?

Di sinilah diagram-ER kita mulai berperan penting dalam pembentukan basis data kita. Langkah berikutnya adalah pemetaan (mapping), yaitu menerjemahkan diagram-ER itu menjadi tabel dan kolom. Gimana caranya? Total ada 7 langkah yang harus dikerjakan urut. Waduh banyak ya :D tapi jangan khawatir, ketujuhnya mudah diikuti kok.

Supaya lebih mudah lagi, di tiap langkah langsung aku beri contoh. Kita akan pakai contoh diagram-ER milik stash yang sudah jadi di langkah sebelumnya. Andaikan ternyata ada langkah yang tidak perlu dikerjakan, aku akan berikan contoh diagram-ER lain. Yang aku tebali adalah kata kunci yang perlu diingat untuk melakukan pemetaan.

Yuk mulai!

1. Petakan tiap entitas kuat menjadi sebuah tabel tersendiri. Jangan lupa para atributnya dijadikan kolom entitas yang bersangkutan, kecuali atribut nilai-banyak (atribut ini punya aturan sendiri nanti).

Contoh! Pemetaan entitas Barang jadinya seperti ini:

Barang
KodeBarang NamaBarang HargaBarang Stok

Bisa untuk FakturPenjualan?

[spoiler=Pemetaan entitas FakturPenjualan]FakturPenjualan
NoFaktur Tanggal TotalQty GrandTotal[/spoiler]

2. Petakan tiap atribut lemah menjadi tabel tersendiri, jangan lupa para atributnya. Sekilas sama ya dengan langkah pertama? Tunggu dulu, ada tambahannya...
Tambahkan kunci utama dari entitas kuat yang berelasi dan semua atribut relasi, jika ada, ke dalam tabel ini.

Contoh! Kebetulan diagram-ER stash tidak punya entitas lemah, jadi kita pakai diagram-ER berikut:



Bisa ya memetakan entitas Hotel? Nah, entitas Kamar kalau dipetakan hasilnya gimana? Niii...

Kamar
NoKamar Jenis TarifPerMalam KodeHotel

Kunci utama suatu entitas yang ternyata masuk ke entitas lain ini disebut juga kunci asing (foreign key).

Sejauh ini masih mudah ya :D tiga langkah berikutnya berhubungan dengan participation constraint dan cardinality ratio yang tadi kita sudah berpusing-pusing ria tentukannya :P aku pecah ke tulisan berikutnya, berhubung pemetaan ini rada panjang...
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Nah, apa sih pengaruhnya participation constraint dan cardinality ratio ke pemetaan kita? Ngapain sih pusing-pusing menentukan keduanya? Di tiga langkah berikut kita akan tahu kenapa keduanya berpengaruh ke hasil pemetaan. Next!

3. Petakan tiap relasi 1-1. Secara umum, kunci utama salah satu entitas akan masuk ke entitas lain sebagai kunci asing, dan atribut relasi akan masuk mengikuti entitas mana yang dimasuki kunci asing. Nah, kunci utamanya siapa tapi? Tergantung participation constraint:
- Jika relasinya total-total atau parsial-parsial, kita bebas menentukan kunci utama siapa yang masuk ke entitas lain sebagai kunci asing. Boleh entitas kiri, boleh entitas kanan.
- Jika relasinya total-parsial atau parsial-total (sama saja sebetulnya :P), kunci utama dari entitas yang relasinya total akan masuk ke entitas yang relasinya parsial, diikuti dengan semua atribut relasi.

Contoh! Lagi-lagi diagram-ER stash nggak punya relasi ini, jadi kita pinjam diagram-ER berikut:



Ini seharusnya relasi manajer-departemen, tapi manajer kan juga karyawan :D asumsinya, ada departemen yang tidak punya manajer, misalkan baru buka atau manajernya resign dan belum ada pengganti; satu departemen hanya punya satu manajer. Nah, hasil pemetaan sampai langkah kedua kan seperti ini:

Karyawan
NIK NamaKaryawan

Departemen
KodeDept NamaDept

Terus, langkah ketiga gimana? Berhubung relasinya parsial-parsial, kita bebas tentukan mana kunci asingnya. Jadi, pemetaan berikut betul:

Karyawan
NIK NamaKaryawan KodeDept

Departemen
KodeDept NamaDept

Pemetaan berikut juga betul:

Karyawan
NIK NamaKaryawan

Departemen
KodeDept NamaDept NIK

Silakan pilih salah satu :)

Nah, andai aku ubah sedikit asumsinya sehingga semua departemen pasti punya manajer:



Hanya pemetaan berikut yang betul:

Karyawan
NIK NamaKaryawan KodeDept

Departemen
KodeDept NamaDept

4. Petakan tiap relasi 1-N. Mudah saja, kunci utama entitas yang punya rasio 1 akan masuk ke entitas yang punya rasio N, diikuti dengan semua atribut relasi. Kita nggak perlu meributkan participation constraint di sini :)

Contoh! Menggunakan diagram-ER berikut:



pemetaannya adalah:

Siswa
NIS NamaSiswa KodeSekolah

Sekolah
KodeSekolah NamaSekolah

5. Petakan tiap relasi M-N. Hasilnya agak beda dengan langkah-langkah sebelumnya, karena mulai langkah kelima ini hasil pemetaan kita berupa tabel baru. Isinya apa saja? Semua kunci utama dari relasi yang berhubungan; dan semuanya tetap menjadi kunci utama. Yup, satu tabel boleh memiliki lebih dari satu kunci utama. Kesemua kunci utama itu sekaligus juga jadi kunci asing, tapi kita bisa abaikan fakta ini :)

Contoh! Nah kebetulan sekali diagram-ER stash punya relasi M-N, jadi kita bisa petakan. Hasilnya? Berhubung nama relasinya nggak pas, aku beri nama tabel ini DetailFakturPenjualan.

DetailFakturPenjualan
NoFaktur KodeBarang HargaJual JmlBeli Subtotal

Bisa dilihat kan, KodeBarang dari tabel Barang dan NoFaktur dari tabel FakturPenjualan kembali jadi kunci utama di sini.

Nggak terlalu susah ya :) sisa dua langkah, dituntaskan yuk!
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

OK! Sisa dua langkah lagi, dan keduanya (tiga sebetulnya, dengan langkah 5 tadi) sama-sama membentuk tabel baru. Apa saja mereka?

6. Petakan tiap relasi N-ary. Nah lho, relasi apa nih? Aku memang tidak sebut dari tadi karena ini biasanya jarang terjadi. Tapi, andaikata ada lebih dari dua entitas yang berelasi dalam suatu waktu, ini bisa disebut relasi N-ary.
Pemetaannya simpel saja: semua kunci utama dari semua entitas yang berelasi masuk ke tabel baru, tetap sebagai kunci utama. Jangan lupa atribut relasinya :)

Contoh! Berhubung diagram-ER stash sudah selesai dipetakan, dan contoh relasi N-ary agak susah, aku pinjamkan diagram-ER dari Tales of Another Journey, kebetulan ada relasi N-ary di sana. Aku potong relasi N-ary-nya saja karena diagramnya superbesar, nanti pada bingung semua ;D



Ini keterangannya... eee... rada lupa :P maksudnya untuk menyimpan perlengkapan (item) yang sedang dipakai aktor tertentu (tiap item punya slot sendiri). Karena satu aktor bisa berada di banyak kelompok, makanya ketiganya (actor-slot-item) aku relasikan dengan party juga, supaya ketahuan aktor punya siapa yang sedang mengenakan item tertentu di slot tertentu (ribet yah :P).

Hasil pemetaannya mudah saja:

CurrentEquip
party_id actor_id slot_id item_id

Terakhir!

7. Petakan tiap atribut nilai-banyak. Hasilnya adalah sebuah tabel baru, dengan kunci utama entitas yang punya atribut nilai-banyak menjadi kunci utama, berdampingan dengan atribut nilai-banyak itu sendiri (yang juga sekaligus jadi kunci utama).

Bingung? Nii contohnya... aku tambahkan nomor HP ke entitas Siswa dan diasumsikan tiap Siswa punya lebih dari satu nomor HP:



Pemetaannya jadi seperti ini:

Siswa
NIS NamaSiswa

Siswa_MV (namanya bebas sih...)
NIS NoHP

Selesai deh :D sekarang kita sudah bisa lihat manfaatnya membuat diagram-ER. Sama kan dengan hasil kira-kira tadi :) so, setelah membaca artikel ini, bisa deh membuat sistem yang lebih kompleks lagi. Atau mau kejutkan anak informatika dengan membaca diagram-ER mereka? ;D

Sebetulnya masih ada satu langkah terakhir untuk meyakinkan diri bahwa hasil pemetaan ini sudah sah atau belum, tapi aku stop dulu sampai di sini :)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen