สมมุติเรามีคลาสดังนี้
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