Konsep Baru Pemodelan Database dengan Anchor Modeling

767 views

Published on

Contoh Kasus Perubahan Struktur dan Konten Database

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
767
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Konsep Baru Pemodelan Database dengan Anchor Modeling

  1. 1. Konsep Baru Pemodelan Database dengan Anchor Modeling Bowo Prasetyo Contoh Kasus Perubahan Struktur dan Konten Database 10 Desember 2011 http://www.scribd.com/prazjp http://www.slideshare.net/bowoprasetyo
  2. 2. Anchor Modeling <ul><li>Teknik pemodelan database agile yang cocok untuk informasi yang berubah seiring waktu baik struktur maupun konten-nya.
  3. 3. Berbasis pada empat konstruksi permodelan: anchor , attribute , tie dan knot .
  4. 4. Hasilnya dapat diterjemahkan ke desain relational database, di mana hampir semua tabelnya akan berada pada bentuk sixth normal form (6NF). </li></ul>
  5. 5. Online Resources <ul><li>Official site </li></ul>http://www.anchormodeling.com/ <ul><li>Online tutorial </li></ul>http://www.anchormodeling.com/?page_id=186 <ul><li>Online anchor modeler </li></ul>http://www.anchormodeling.com/modeler/
  6. 6. Perubahan Database 2 Perubahan Struktur dan Konten Mencatat Masukan Salam
  7. 7. Peringatan <ul><li>Contoh aplikasi HelloEnterprise ini memiliki beberapa aspek yang tidak baik, antara lain: </li><ul><li>Menggunakan database MySQL yang tidak mendukung fitur “ table elimination ”. </li><ul><li>Seharusnya menggunakan database yang mendukung fitur ini, mis. PostgreSQL. </li></ul><li>Mengakses database langsung dari halaman JSP yang seharusnya hanya untuk tampilan. </li><ul><li>Seharusnya mengakses database dari komponen domain atau model pada pola MVC (model-view-controller) atau PM (presentation-model). </li></ul></ul></ul>
  8. 8. Mencatat Masukan Salam <ul><li>Aplikasi HelloEnterprise *) dimodifikasi untuk: </li><ul><li>menerima masukan sebuah salam dari user,
  9. 9. mencatatnya di database,
  10. 10. dan menampilkan tiga salam terakhir. </li></ul></ul>*) Lihat tutorial “Konsep Baru Pemodelan Database dengan Anchor Modeling – Teknik Pemodelan Database Agile untuk Struktur dan Konten yang Berubah Seiring Waktu”
  11. 11. Penambahan Entitas <ul><li>Diperlukan tambahan entitas baru: </li><ul><li>Greeting : salam yang diucapkan user .
  12. 12. Berarti ada anchor baru yang sesuai, dengan satu attribute teks salam.
  13. 13. Dan tie baru yang menghubungkannya dengan anchor US_User . </li><ul><li>Greeting was said by user . </li></ul><li>Untuk melacak salam apa yang diucapkan user pada waktu tertentu, maka untuk tie di atas perlu dibuatkan sejarah. </li></ul></ul>
  14. 14. Anchor Model <ul><li>Tambah satu anchor : GE_Greeting
  15. 15. Tambah satu attribute : GE_TXT_Greeting_Text
  16. 16. Tambah satu tie bersejarah: GE_wasSaid_US_by </li></ul>
  17. 17. Entity Relationship Model <ul><li>Tiga tabel baru dalam 6NF: </li><ul><li>GE_Greeting , GE_TXT_Greeting_Text dan GE_wasSaid_US_by </li></ul></ul>
  18. 18. Table Creation SQL CREATE TABLE ge_greeting ( GE_ID int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (GE_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; CREATE TABLE ge_txt_greeting_text ( GE_ID int(11) NOT NULL, GE_TXT_Greeting_Text varchar(64) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (GE_ID), UNIQUE KEY GE_TXT_Greeting_Text (GE_TXT_Greeting_Text) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  19. 19. Table Creation SQL CREATE TABLE ge_wassaid_us_by ( US_ID varchar(64) COLLATE utf8_unicode_ci NOT NULL, GE_ID int(11) NOT NULL, GE_wasSaid_US_by_ChangedAta datetime NOT NULL, PRIMARY KEY (US_ID,GE_ID,GE_wasSaid_US_by_ChangedAta), KEY GE_ID (GE_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ALTER TABLE `ge_txt_greeting_text` ADD CONSTRAINT ge_txt_greeting_text_ibfk_1 FOREIGN KEY (GE_ID) REFERENCES ge_greeting (GE_ID); ALTER TABLE `ge_wassaid_us_by` ADD CONSTRAINT ge_wassaid_us_by_ibfk_2 FOREIGN KEY (GE_ID) REFERENCES ge_greeting (GE_ID), ADD CONSTRAINT ge_wassaid_us_by_ibfk_1 FOREIGN KEY (US_ID) REFERENCES us_user (US_ID);
  20. 20. Masukan Salam <ul><li>Menggunakan tag <form> di file /jdbc/index.jsp </li></ul><form method=&quot;POST&quot; action=&quot;greeting.jsp&quot;> <ul> <li>Masukkan salam anda: <input type=&quot;text&quot; name=&quot;greeting&quot; /></li> </ul> <input type=&quot;submit&quot; value=&quot;Kirim&quot; /> </form>
  21. 21. Menampilkan Salam <ul><li>Yang perlu diambil dari database adalah: </li><ul><li>Teks salam (di tabel attribute ge_txt_greeting_text )
  22. 22. Waktu pengucapan salam (di table tie ge_wassaid_us_by ) </li></ul><li>From clause utama terdiri dari tabel-tabel anchor terkait yang di join tanpa syarat : </li><ul><li>us_user us JOIN ge_greeting ge </li></ul><li>Dilanjutkan join dengan tabel-tabel attribute terkait: </li><ul><li>JOIN ge_txt_greeting_text ge_txt ON ge_txt.GE_ID = ge.GE_ID </li></ul></ul>
  23. 23. Menampilkan Salam <ul><li>Dilanjutkan join dengan tabel-tabel tie terkait: </li><ul><li>JOIN ge_wassaid_us_by ge_us ON ge_us.GE_ID = ge.GE_ID AND ge_us.US_ID = us.US_ID </li></ul><li>Where clause dilakukan terhadap anchor : </li><ul><li>WHERE us.US_ID = '<%= username %>' </li></ul><li>Diakhiri dengan order dan limit : </li><ul><li>ORDER BY ge_us.GE_wasSaid_US_by_ChangedAt DESC LIMIT 3 </li></ul></ul>
  24. 24. Menampilkan Salam <ul><li>Menggunakan <sql:query> untuk meng ambil salam dari database. </li></ul><sql:query var=&quot;result&quot; dataSource=&quot;jdbc/security&quot;> SELECT ge_txt.GE_TXT_Greeting_Text, ge_us.GE_wasSaid_US_by_ChangedAt FROM us_user us JOIN ge_greeting ge JOIN ge_txt_greeting_text ge_txt ON ge_txt.GE_ID = ge.GE_ID JOIN ge_wassaid_us_by ge_us ON ge_us.GE_ID = ge.GE_ID AND ge_us.US_ID = us.US_ID WHERE us.US_ID = '<%= username %>' ORDER BY ge_us.GE_wasSaid_US_by_ChangedAt DESC LIMIT 3 </sql:query>
  25. 25. Menampilkan Salam <ul><li>Dan <c:forEach> untuk me loop semua hasil. </li></ul><table border=&quot;1&quot;> <!-- column headers --> <tr> <c:forEach var=&quot;columnName&quot; items=&quot;${result.columnNames}&quot;> <th><c:out value=&quot;${columnName}&quot;/></th> </c:forEach> </tr>
  26. 26. Menampilkan Salam <!-- column data --> <c:forEach var=&quot;row&quot; items=&quot;${result.rowsByIndex}&quot;> <tr> <c:forEach var=&quot;column&quot; items=&quot;${row}&quot;> <td><c:out value=&quot;${column}&quot;/></td> </c:forEach> </tr> </c:forEach> </table>
  27. 27. File Lengkap /jdbc/index.jsp <%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot;%> <%@taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot;%> <%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%> <% String username = ((HttpServletRequest) pageContext.getRequest()).getUserPrincipal().getName(); %> <!DOCTYPE html> <html> <head> <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;>
  28. 28. File Lengkap /jdbc/index.jsp <title>Otentikasi Berbasis Form dengan Realm JDBC untuk JSP</title> </head> <body> <sql:query var=&quot;sex&quot; dataSource=&quot;jdbc/security&quot;> SELECT SEX_ID FROM us_sex_user_sex WHERE US_ID = '<%= username%>' </sql:query> <c:choose> <c:when test='${sex.rows[0].SEX_ID == &quot;M&quot;}'> <c:set var=&quot;title&quot; value=&quot;Bapak&quot; scope=&quot;page&quot; /> </c:when>
  29. 29. File Lengkap /jdbc/index.jsp <c:otherwise> <c:set var=&quot;title&quot; value=&quot;Ibu&quot; scope=&quot;page&quot; /> </c:otherwise> </c:choose> <sql:query var=&quot;name&quot; dataSource=&quot;jdbc/security&quot;> SELECT US_NAM_User_Name FROM us_nam_user_name WHERE US_ID = '<%= username%>' </sql:query> <h1>Hello <c:out value=&quot;${title}&quot; /> <c:out value=&quot;${name.rows[0].US_NAM_User_Name}&quot; />!</h1> <form method=&quot;POST&quot; action=&quot;greeting.jsp&quot;> <ul>
  30. 30. File Lengkap /jdbc/index.jsp <li>Masukkan salam anda: <input type=&quot;text&quot; name=&quot;greeting&quot; /></li> </ul> <input type=&quot;submit&quot; value=&quot;Kirim&quot; /> </form> <p> <sql:query var=&quot;result&quot; dataSource=&quot;jdbc/security&quot;> SELECT ge_txt.GE_TXT_Greeting_Text, ge_us.GE_wasSaid_US_by_ChangedAt FROM us_user us JOIN ge_greeting ge JOIN ge_txt_greeting_text ge_txt ON ge_txt.GE_ID = ge.GE_ID JOIN ge_wassaid_us_by ge_us ON ge_us.GE_ID = ge.GE_ID AND ge_us.US_ID = us.US_ID WHERE us.US_ID = '<%= username %>' ORDER BY ge_us.GE_wasSaid_US_by_ChangedAt DESC LIMIT 3 </sql:query>
  31. 31. File Lengkap /jdbc/index.jsp <table border=&quot;1&quot;> <!-- column headers --> <tr> <c:forEach var=&quot;columnName&quot; items=&quot;${result.columnNames}&quot;> <th><c:out value=&quot;${columnName}&quot;/></th> </c:forEach> </tr> <!-- column data --> <c:forEach var=&quot;row&quot; items=&quot;${result.rowsByIndex}&quot;>
  32. 32. File Lengkap /jdbc/index.jsp <tr> <c:forEach var=&quot;column&quot; items=&quot;${row}&quot;> <td><c:out value=&quot;${column}&quot;/></td> </c:forEach> </tr> </c:forEach> </table> </p> <a href=&quot;../logout.jsp&quot;>Logout</a> </body> </html>
  33. 33. Meng insert Salam <ul><li>Dilakukan di file /jdbc/greeting.jsp
  34. 34. Pertama buka transaksi database.
  35. 35. Lalu cek salam di tabel attribute . </li><ul><li>Salam masukan user bisa didapat dari variabel JSTL ${param.greeting} . </li></ul><li>Kalau tidak ada, insert salam di tabel anchor dan attribute .
  36. 36. Insert salam dan waktunya di tabel tie .
  37. 37. Terakhir tutup transaksi database. </li></ul>
  38. 38. Mengecek Salam di Tabel Attribute <sql:transaction dataSource=&quot;jdbc/security&quot;> <sql:query var=&quot;geId&quot;> SELECT GE_ID FROM ge_txt_greeting_text WHERE GE_TXT_Greeting_Text = '${param.greeting}' </sql:query>
  39. 39. Meng insert Salam di Tabel Anchor <sql:update var=&quot;inserted&quot;> INSERT INTO ge_greeting (GE_ID) VALUES (NULL) </sql:update>
  40. 40. Meng insert Salam di Tabel Attribute <sql:query var=&quot;geId&quot;> SELECT LAST_INSERT_ID() GE_ID </sql:query> <sql:update var=&quot;inserted&quot;> INSERT INTO ge_txt_greeting_text (GE_ID, GE_TXT_Greeting_Text) VALUES (${geId.rows[0].GE_ID}, '${param.greeting}') </sql:update>
  41. 41. Meng insert Salam dan Waktunya di Tabel Tie <sql:update var=&quot;inserted&quot;> INSERT INTO ge_wassaid_us_by (US_ID, GE_ID, GE_wasSaid_US_by_ChangedAt) VALUES ('<%= username%>', ${geId.rows[0].GE_ID}, NOW()) </sql:update> </sql:transaction>
  42. 42. File Lengkap /jdbc/greeting.jsp <%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot;%> <%@taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot;%> <%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%> <% String username = ((HttpServletRequest) pageContext.getRequest()).getUserPrincipal().getName(); %> <!DOCTYPE html> <html> <head> <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;>
  43. 43. File Lengkap /jdbc/greeting.jsp <title>Inserting Greeting Page</title> </head> <body> <sql:transaction dataSource=&quot;jdbc/security&quot;> <!-- check if greeting exists in attribute table --> <sql:query var=&quot;geId&quot;> SELECT GE_ID FROM ge_txt_greeting_text WHERE GE_TXT_Greeting_Text = '${param.greeting}' </sql:query> <!-- insert greeting if not exists in attribute table --> <c:if test=&quot;${empty geId.rows[0].GE_ID}&quot;> <!-- first inserts the primary key in anchor table -->
  44. 44. File Lengkap /jdbc/greeting.jsp <sql:update var=&quot;inserted&quot;> INSERT INTO ge_greeting (GE_ID) VALUES (NULL) </sql:update> <!-- then inserts text into attribute table if succeeded --> <c:if test=&quot;${inserted > 0}&quot;> <sql:query var=&quot;geId&quot;> SELECT LAST_INSERT_ID() GE_ID </sql:query> <sql:update var=&quot;inserted&quot;>
  45. 45. File Lengkap /jdbc/greeting.jsp INSERT INTO ge_txt_greeting_text (GE_ID, GE_TXT_Greeting_Text) VALUES (${geId.rows[0].GE_ID}, '${param.greeting}') </sql:update> <h4>New greeting <c:out value=&quot;${param.greeting}&quot; /> was inserted!</h4> </c:if> </c:if> <!-- insert greeting times into tie otherwise --> <sql:update var=&quot;inserted&quot;>
  46. 46. File Lengkap /jdbc/greeting.jsp INSERT INTO ge_wassaid_us_by (US_ID, GE_ID, GE_wasSaid_US_by_ChangedAt) VALUES ('<%= username%>', ${geId.rows[0].GE_ID}, NOW()) </sql:update> </sql:transaction> <h4>Time of <c:out value=&quot;${param.greeting}&quot; /> was recorded!</h4> <a href=&quot;./index.jsp&quot;>Index</a> </body> </html>
  47. 47. Masukan Salam <ul><li>Setelah login user akan diminta masukan salam. </li></ul>
  48. 48. Meng insert Salam <ul><li>Salam baru di insert dan dicatat waktunya. </li></ul><ul><li>Salam yang sudah ada hanya dicatat waktunya. </li></ul>
  49. 49. Tiga Salam Terakhir <ul><li>Menampilkan tiga salam terakhir. </li></ul>
  50. 50. Referensi <ul><li>Tutorial “Konsep Baru Pemodelan Database dengan Anchor Modeling – Teknik Pemodelan Database Agile untuk Struktur dan Konten yang Berubah Seiring Waktu”
  51. 51. Anchor Modeling – Wikipedia, http://en.wikipedia.org/wiki/Anchor_Modeling
  52. 52. Online Anchor Modeler, http://www.anchormodeling.com/modeler/
  53. 53. Anchor Modeling: Naming Convention, http://www.anchormodeling.com/wp-content/uploads/2010/09/AM-Naming.pdf
  54. 54. The NetBeans E-commerce Tutorial - Connecting the Application to the Database, http://netbeans.org/kb/docs/javaee/ecommerce/connect-db.html </li></ul>

×