[ Log On ]
TPH หรือ TPT ดี?

สำหรับโปรแกรมเมอร์ที่ใช้ Code First พอถึงจุดๆ หนึ่ง มักจะต้องตัดสินใจว่าจะเลือกใช้แนวทางไหนดี ระหว่าง TPH (Table per Hierachy) กับ TPT (Table per Type) 

ทั้ง 2 แบบมีข้อดีและข้อเสียแตกต่างกันไปครับ แต่ส่วนตัวแล้วคิดว่า ในการออกแบบโครงสร้างฐานข้อมูลโดยใช้ Code First นั้น ข้อได้เปรียบอย่างเดียวของ TPH คือ มันไม่ต้องไป join table นั่นทำให้ประสิทธิภาพในการประมวลผล การดึงข้อมูล ฯลฯ มันเร็วกว่าแบบ TPT แน่นอนครับ แต่.. การปรับแต่งหรือการเพิ่ม type เข้าไปในภายหลังมันอาจจะดูวุ่นวายและรกรุงรังกว่า

สมมติเรามีการเพิ่ม type ชนิดใหม่เข้าไป การใช้ TPH เท่ากับว่าเราจะต้องไปทำการแก้ไข schema ของ table โดยการเพิ่ม field ใหม่เข้าไป.. แต่ถ้าใช้ TPT เราก็สร้าง table ใหม่ขึ้นมาและสร้าง relationship เพิ่มเติมเข้าไปอีกนิดหน่อยเท่านั้น

สำหรับการลด type ในแนวทาง TPH นั้น เราก็จะต้องเข้าไปลบ field ใน table ออก (หรือจะค้างไว้เป็น null แบบนั้นก็ได้ ตามสมควร..ขี้เกียจล่ะสิ!) ส่วนในแนวทางของ TPT นั้น  เราสามารถลบ table ของ type นั้นออกไปได้เลยครับ

สรุปว่า

ถ้ามีส่วนไหนที่เรามั่นใจว่าโครงสร้างข้อมูลมันค่อนข้างไม่เปลี่ยนแปลง หรือมีการเปลี่ยนแปลงที่น้อยมาก และต้องการเน้นเรื่องประสิทธิภาพมากกว่า แนะนำให้เลือก TPH ไปเลยครับ ส่วนกรณีนอกเหนือจากนั้น ใช้แบบ TPT ไปเถอะครับ

Happy Coding ครับ!

Update: ที่ blog นี้ "Tip 12 - How to choose an Inheritance Strategy" จะมีตารางช่วยให้เข้าใจและช่วยให้ตัดสินใจเลือกได้ง่ายขึ้นครับ

 


O'Reilly Programming Entity Framework: Code First

แนะนำให้หาซื้อเล่มนี้มาอ่านนะครับ ค่อนข้างจะละเอียดในเรื่องการเขียน Code First .. ผมใช้เป็น kindle edition มาอ่าน ราคา $10.09 ตีเป็นเงินไทยก็ราวๆ 300 บาทเท่านั้นเองครับ

หรือถ้าใครมี code สำหรับ e-book upgrade ก็สามารถไปหาซื้อได้ที่ O'Reilly Shop ในราคา $4.99 .. ร้อยกว่าบาท ถูกจะตายชักครับ!