Extending domain classes with inheritant in Grails, การสืบทอดโดเมนคลาสใน Grails

สมมุติเรามีคลาสดังนี้
class Person {
String name
}

class Employee extends Person {
String employeeID
}

class Student extends Person {
String studentID
String faculty
}

ในฐานข้อมูลจะเป็นอย่างไร? จะมีตารางแยกจากกันหรือจะมีแค่ตารางเดียว คำตอบคือ ใน grails ทำได้ทั้งสองอย่าง

แบบแรก table per hierarchy mapping
โดยปกติแล้วเราจะได้ตาราง person ในฐานข้อมูลที่มีคุณสมบัติ ของทั้งคลาสแม่และคลาสลูกอยู่ด้วยกันไม่ว่า Person จะถูกสืบทอดมากน้อยแค่ไหน เราก็จะได้แค่ตารางในฐานข้อมูลเพียงตาราง Person ตารางเดียว โดยเวลาที่เราสร้าง instance ของคลาส ใด ๆ ที่อยู่ในลำดับของการสืบทอดก็ตาม คุณสมบัติที่ไม่มีในคลาสอื่นก็จะมีค่าเป็น null ในคอลัมน์ ซึ่งมันก็ไม่มีปัญหาใด ๆ เพราะ grails มันจะสร้าง ตารางที่มีคอลัมที่สามารถมีค่าเป็น null ได้ ลองคิดดูว่าหากมีการสือบทอดกันยาว ๆ แล้วละก็ ตาราง Person จะวุ่นวายขนาดไหน

แบบที่สอง table per subclass mapping
คือ ทำให้ตารางแยกออกจากกัน โดยเราต้องระบุลงไปในคลาสแม่ ดังนี้

static mapping = {
tablePerHierarchy false
}

เราก็จะได้ตารางที่ถูกแยกออกจากัน เวลาเราจะรับข้อมูลของคลาสลูกมันจะรวบรวมคุณสมบัติทั้งหมดที่เกี่ยวข้อง ซึ่งจะทำให้เกิดการ join ตารางเกิดขึ้น ถ้าหากเรามองในเรื่องประสิทธิภาพแล้วการไม่มีการ join ตารางนั้นเวลาเรา query ข้อมูลก็จะมีประสิทธิภาพมากกว่าพูดง่าย ๆ คือเร็วกว่า

สรุปแล้วจะเลือกใช้แบบไหนอันนี้ก็ขึ้นอยู่กับหลายอย่างรวมทั้ง business logic ด้วย ก็พิจารณาเลือกใช้ตามความเหมาะสมของแต่ละ Application

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s