Anda di halaman 1dari 38

Konsep Baru Pemodelan Database dengan Anchor Modeling

Bowo Prasetyo Teknik Pemodelan Database Agile untuk Struktur dan Konten yang Berubah Seiring Waktu
8 Desember 2011 http://www.scribd.com/prazjp http://www.slideshare.net/bowoprasetyo

Anchor Modeling

Teknik pemodelan database agile yang cocok untuk informasi yang berubah seiring waktu baik struktur maupun konten-nya. Berbasis pada empat konstruksi permodelan: anchor, attribute, tie dan knot. Hasilnya dapat diterjemahkan ke desain relational database, di mana hampir semua tabelnya akan berada pada bentuk sixth normal form (6NF).

Kelebihan dan Kekurangan


Model berevolusi secara non-destructive. Menghindari nilai null. Informasi bebas dari redundancy. Isu performa akibat join berlebih.

dapat dihindari berkat fitur 'table elimination' pada database modern.


Sudah disupport oleh PostgreSQL. Belum disupport oleh MySQL.

Anchor

Anchor adalah model untuk entitas dan event. Dilambangkan dengan bujur sangkar penuh. Konvensi penamaan: AD_AnchorDescription

AD: mnemonic dengan dua huruf besar. AnchorDescription: deskripsi dengan huruf

besar di depan setiap kata.

Attribute

Attribute adalah model untuk properti dari anchor. Dilambangkan dengan lingkaran kosong. Perubahan informasi atribut dapat dibuatkan sejarah, dilambangkan dengan outline ganda. Konvensi penamaan:
AD_ATD_AnchorDescription_AttributeDescripti on

ATD: mnemonic dengan tiga huruf besar. AttributeDescription: deskripsi dengan huruf

besar di depan setiap kata.

Tie

Tie adalah model untuk hubungan antar anchor. Dilambangkan dengan belah ketupat penuh. Perubahan informasi tie dapat dibuatkan sejarah, dilambangkan dengan outline ganda. Konvensi penamaan: A1_role1_A2_role2

A1/2: mnemonic anchor 1/2 role1/2: peran anchor 1/2, kata pertama adalah

kata kerja dengan huruf kecil

Knot

Knot adalah model untuk properti bersama, mis. gender, state. Dilambangkan dengan bujur sangkar kosong. Konvensi penamaan: KND_KnotDescription

KND: mnemonic dengan tiga huruf besar. KnotDescription: deskripsi dengan huruf besar

di depan setiap kata

Online Resources

Official site http://www.anchormodeling.com/ Online tutorial Online anchor modeler http://www.anchormodeling.com/modeler/

http://www.anchormodeling.com/?page_id=186

Contoh

Aplikasi Java EE HelloEnterprise

Peringatan

Contoh aplikasi HelloEnterprise ini memiliki beberapa aspek yang tidak baik, antara lain:

Menggunakan database MySQL yang tidak mendukung fitur table elimination.

Seharusnya menggunakan database yang mendukung fitur ini, mis. PostgreSQL.

Mengakses database langsung dari halaman JSP yang seharusnya hanya untuk tampilan.

Seharusnya mengakses database dari komponen domain atau model pada pola MVC (modelview-controller) atau PM (presentationmodel).

Database Pengguna

Pengguna aplikasi HelloEnterprise mempunyai dua entitas:

Entitas user dengan sebuah properti:

Password

Entitas group User belongs to group.

Hubungan antara dua entitas tersebut adalah:

Anchor Model

Dua anchor: US_User, GR_Group Satu attribute: US_PWD_User_Password Satu tie: US_belongs_GR_to

Entity Relationship Model

Empat tabel dalam 6NF:

US_User, GR_Group, US_belongs_GR_to, US_PWD_User_Password

Realm JDBC GlassFish

Realm JDBC GlassFish mensyaratkan database pengguna memiliki struktur seperti berikut*) .

*) Lihat tutorial Mengamankan Aplikasi Java EE 6 Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form

Penyesuaian Database

Database pengguna perlu disesuaikan seperti berikut:

Usertable US_User

Username US_ID Password US_PWD_User_Password Groupname GR_ID

Grouptable US_belongs_GR_to

Table Creation SQL


CREATE TABLE us_user ( US_ID varchar(64) COLLATE utf8_unicode_ci NOT NULL, US_PWD_User_Password varchar(64) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (US_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE gr_group ( GR_ID varchar(64) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (GR_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Table Creation SQL


CREATE TABLE us_belongs_gr_to ( US_ID varchar(64) COLLATE utf8_unicode_ci NOT NULL, GR_ID varchar(64) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (US_ID,GR_ID), KEY GR_ID (GR_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `us_belongs_gr_to` ADD CONSTRAINT us_belongs_gr_to_ibfk_2 FOREIGN KEY (GR_ID) REFERENCES gr_group (GR_ID), ADD CONSTRAINT us_belongs_gr_to_ibfk_1 FOREIGN KEY (US_ID) REFERENCES us_user (US_ID);

Hello user!

HelloEnterprise akan memberikan salam kepada user yang login.

Perubahan Database 1

Perubahan Struktur

Nama dan Jenis Kelamin

HelloEnterprise akan dimodifikasi untuk menampilkan nama lengkap dan jenis kelamin user, seperti berikut: Hello Bapak/Ibu Nama Lengkap

Bapak: kalau jenis kelamin lelaki Ibu: kalau jenis kelamin perempuan

Penambahan Properti

Entitas user mempunyai dua properti baru:


Name dan sex. Berarti anchor US_User mendapat dua attribute baru yang sesuai. Male dan female. Berarti untuk attribute terkait sex dapat dibuatkan knot.

Properti sex hanya mempunyai dua nilai:


Anchor Model

Dua attribute baru: US_NAM_User_Name dan US_SEX_User_Sex Satu knot: SEX_Sex

Entity Relationship Model

Tiga tabel baru dalam 6NF:

US_NAM_User_Name, US_SEX_User_Sex

dan SEX_Sex

Table Creation SQL


CREATE TABLE sex_sex ( SEX_ID enum('M','F') COLLATE utf8_unicode_ci NOT NULL, SEX_sex varchar(8) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (SEX_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE us_nam_user_name ( US_ID varchar(64) COLLATE utf8_unicode_ci NOT NULL, US_NAM_User_Name varchar(128) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (US_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Table Creation SQL


CREATE TABLE us_sex_user_sex ( US_ID varchar(64) COLLATE utf8_unicode_ci NOT NULL, SEX_ID enum('M','F') COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (US_ID), KEY SEX_ID (SEX_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ALTER TABLE `us_nam_user_name` ADD CONSTRAINT us_nam_user_name_ibfk_1 FOREIGN KEY (US_ID) REFERENCES us_user (US_ID); ALTER TABLE `us_sex_user_sex` ADD CONSTRAINT us_sex_user_sex_ibfk_3 FOREIGN KEY (US_ID) REFERENCES us_user (US_ID);

Mengakses Database

Mengakses database dari JSP dapat menggunakan JSTL (JSP Standard Tag Library), dengan cara:

Membuat referensi ke JDBC resource di deployment descriptor standar (web.xml). Mengakses database dengan taglib JSTL <sql:query>. Menampilkan hasilnya dengan taglib JSTL <c:out>.

Referensi JDBC

Jalankan Netbeans, buka modul web HelloEnterprise-war*). Di Projects Explorer, buka node Web Pages WEB-INF. Buka file web.xml, klik tab References. Buka node Resource References, klik Add... Isi field seperti halaman berikut, klik OK.

*) Lihat tutorial Mengamankan Aplikasi Java EE 6 Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form

Field Referensi JDBC

Resource Name: jdbc/security*) Resource Type: javax.sql.DataSource Authentication: Container Sharing Scope: Shareable Description: Connects to hello database

*) Nama JDBC resource yang telah dibuat di GlassFish.

Referensi JDBC web.xml


<web-app> ... <resource-ref> <description>Connects to hello database</description> <res-ref-name>jdbc/security</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> scope> <res-sharing-scope>Shareable</res-sharing-

</resource-ref> ... </web-app>

Mengakses Database dengan <sql:query>

Mengimport taglib JSTL prefix SQL yang diperlukan untuk mengakses database. Mengakses database dengan taglib <sql:query>.

<%@taglib prefix="sql" uri=" http://java.sun.com/jsp/jstl/sql"%> <sql:query var="sex" dataSource="jdbc/security"> SELECT US_NAM_User_Name FROM us_nam_user_name WHERE US_ID = '<%= username%>' </sql:query>

Menampilkan Hasil dengan <c:out>

Mengimport taglib JSTL prefix C yang diperlukan untuk menampilkan data. Menampilkan hasil dengan <c:out>.

<%@taglib prefix="c" uri=" http://java.sun.com/jsp/jstl/core"%> <c:out value=" ${name.rows[0].US_NAM_User_Name}" />

Memilih Opsi dengan <c:choose>


<c:choose> <c:when test='${sex.rows[0].SEX_ID == "M"}'> <c:set var="title" value="Bapak" scope="page" /> </c:when> <c:otherwise> <c:set var="title" value="Ibu" scope="page" /> </c:otherwise> </c:choose>

File Lengkap /jdbc/index.jsp


<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <% String username = ((HttpServletRequest) pageContext.getRequest()).getUserPrincipal().getName() ; %> <!DOCTYPE html>

File Lengkap /jdbc/index.jsp


<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Otentikasi Berbasis Form dengan Realm JDBC untuk JSP</title> </head> <body> <sql:query var="sex" dataSource="jdbc/security"> SELECT SEX_ID FROM us_sex_user_sex WHERE US_ID = '<%= username%>' </sql:query>

File Lengkap /jdbc/index.jsp


<c:choose> <c:when test='${sex.rows[0].SEX_ID == "M"}'> <c:set var="title" value="Bapak" scope="page" /> </c:when> <c:otherwise> <c:set var="title" value="Ibu" scope="page" /> </c:otherwise> </c:choose>

File Lengkap /jdbc/index.jsp


<sql:query var="name" dataSource="jdbc/security"> SELECT US_NAM_User_Name FROM us_nam_user_name WHERE US_ID = '<%= username%>' </sql:query> <h1>Hello <c:out value="${title}" /> <c:out value="${name.rows[0].US_NAM_User_Name}" />!</h1> <a href="../logout.jsp">Logout</a> </body> </html>

Hello Bapak/Ibu Nama Lengkap!

Menampilkan jenis kelamin dan nama lengkap.

Referensi

Tutorial Mengamankan Aplikasi Java EE 6 Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form Anchor Modeling Wikipedia, http://en.wikipedia.org/wiki/Anchor_Modeling Online Anchor Modeler, http://www.anchormodeling.com/modeler/

Anchor Modeling: Naming Convention, http://www.anchormodeling.com/wp-content/uploads/2010/09/AM-Nam The NetBeans E-commerce Tutorial - Connecting the Application to the Database, http://netbeans.org/kb/docs/javaee/ecommerce/connect-db.html

Anda mungkin juga menyukai