Thursday, October 13, 2011

Vertical Database Design

สำหรับการทำงานจริงอะไรก็เกิดขึ้นได้ บางครั้งอะไรที่ดีที่สุดก็อาจจะใช้ไม่ได้สำหรับ User (ให้นึกถึงเพลง สิ้นสุดกันที ไม่ว่าชาตินี้ชาติไหน ของอาจารย์สุรพลไว้ ได้อารมย์มาก) ดังเช่นกรณีศึกษาที่ผมเพิ่งจะผ่านมาไม่นานมานี้ เนื่องด้วยโครงสร้างองค์กรที่ต้องการ Security สูง ทำให้มีภายในแผนก IT เองถูกแบ่งย่อยเพื่อที่จะทำให้การบริหารงานเป็นไปอย่างมีระบบและมีประสิทธิภาพ ซึ่งการแบ่งงานตาม Function ของงานแบบนี้มีประโยชน์ทวีคูณต่อองค์กร พนักงานเองควรจะต้องปรับตัวให้ได้เพื่อให้สามารถทำงานได้อย่างมีความสุข วกกลับเข้ามาที่กรณีศึกษา ภายใต้การทำงานครั้งนี้มี Condition ที่จะขัดไม่ได้ดังนี้
     1. ใช้ Grails ในการพัฒนา
     2. ไม่ควรเปลี่ยนโครงสร้าง Database บ่อยครั้งนัก
     3. Requirement ยังไม่นิ่ง อาจมีการเปลี่ยนแปลงได้ทุกเมื่อ
ภายใต้สภาวะการณ์เช่นนี้ถือเป็นการยากในการออกแบบ Database เนื่องจาก Requirement ยังไม่นิ่ง อาจจะมีการเพิ่ม Column ในอนาคต ซึ่งจะกระทบต่อ Function งานอื่นที่มีหน้าที่ดูแล Data Warehouse อาจจะทำให้เค้างานเข้าได้ ยิ่งใช้ Grails ซึ่งหากสร้างหรือเปลี่ยนแปลง Domain แล้วมันจะเข้าไปเปลี่ยนแปลง Database ให้ตามที่เขียนไว้ใน Groovy Class นั้นยิ่งแล้วใหญ่ เราลองมาดูอีกหนึ่งทางออกสำหรับปัญหานี้ดูครับ

หลักจากได้รับคำแนะนำจาก @Amp Thunder ผู้เปี่ยมประสปการณ์ ทำให้เราได้การออกแบบ Database แนวใหม่ (ที่กุไม่ค่อยได้ใช้ ;P) โดยกระผมจะขอตั้งชื่อการออกแบบนี้ว่า "แนวตั้ง" หากหลายคนยังไม่เห็นภาพลองดูรูปประกอบครับ


ซึ่งแน่นอนแบบที่เราชินชากันคือด้านซ้ายมือ แต่ถ้าจะเก็บข้อมูลเพิ่มเช่น อยากจะเก็บเบอร์โทรศัพท์เนี่ย ยังไงก็ต้องเพิ่ม Column แต่ถ้าเราทำแบบขวามือ ไม่ต้องเพิ่มฮ๊าล์ฟฟฟฟฟ (ดู Record ที่ 7)

คราวนี้เราลองมาวิเคราะห์กันดีกว่าว่าหากเลือกใช้การ Design แบบด้านขวามือเนี่ยจะกระทบอะไรกับชีวิตเราบ้าง
     1. แน่นอนเปลี่ยนวิธี Query
     2. หากทำเป็น Application ก็จะต้องเปลี่ยนวิธีการเอา Result Set มา Map กับ Model
     3. Database จะบวม
     4. Performance แย่กว่าแบบซ้ายมือแน่นอน หากมีข้อมูลเยอะ
     5. ไม่ต้องเพิ่ม Column
หากดูผิวเผินอาจจะดูแย่กว่าซ้ายมือทุกประการ มีข้อดัข้อเดียวคือไม่ต้องเพิ่ม Column แต่ท้ายที่สุดแล้วก็ขึ้นอยู่กับ Condition ประกอบการตัดสินใจ การออกแบบนี้อาจจะเหมาะกับการที่ถูกจำกัดไม่ให้เพิ่ม Column และ Requirement ยังไม่นิ่งกว่าแบบซ้ายมือก็ได้ นี่ก็เป็นอีก 1 วิธีการออกแบบ Database นะจ๊ะ สำหรับบางคน (อาจ) จะยังไม่ค่อยได้ใช้ แต่เรียนรู้ไว้ก็ไม่เห็นจะเสียหายเนอะ