ความสัมพันธ์ของ Polymorphic ใน Laravel เป็นวิธีสำหรับแบบจำลองที่จะเป็นของมากกว่าหนึ่งรุ่นอื่นโดยใช้การเชื่อมโยงเดียว ในขณะที่ความยืดหยุ่นแบบไดนามิกนี้น่าดึงดูดในสถานการณ์การพัฒนาบางอย่างการเชื่อมโยง polymorphic มีข้อเสียที่อาจเกิดขึ้นมากมายที่อาจส่งผลกระทบต่อความสมบูรณ์ของฐานข้อมูลประสิทธิภาพการบำรุงรักษาและความยืดหยุ่น
ขาดความสมบูรณ์ของข้อมูลและข้อ จำกัด สำคัญในต่างประเทศ
หนึ่งในข้อเสียที่สำคัญที่สุดของการใช้การเชื่อมโยง polymorphic ใน Laravel คือการไม่สามารถบังคับใช้ข้อ จำกัด ของคีย์ต่างประเทศในระดับฐานข้อมูล โดยทั่วไปแล้วการเชื่อมโยงของ Polymorphic อาศัยสองคอลัมน์ในตารางที่เกี่ยวข้องÂหนึ่งจัดเก็บ ID ของโมเดลที่เกี่ยวข้องและการจัดเก็บประเภท (ชื่อคลาส) เป็นสตริง การออกแบบนี้ช่วยป้องกันการใช้ข้อ จำกัด ของคีย์มาตรฐานเนื่องจากการอ้างอิงคีย์ต่างประเทศแตกต่างกันไปตามแบบจำลองของโมเดลที่เกี่ยวข้อง ดังนั้นเอ็นจิ้นฐานข้อมูลไม่สามารถรับประกันความสมบูรณ์ของการอ้างอิงได้ซึ่งนำไปสู่ความเสี่ยงที่สูงขึ้นของบันทึกกำพร้าหรือไม่สอดคล้องกันหากหน่วยงานที่เกี่ยวข้องถูกลบหรือแก้ไขโดยไม่มีพฤติกรรมการเรียงซ้อนที่เหมาะสมซึ่งบังคับใช้โดยแอปพลิเคชัน
ความซับซ้อนแบบสอบถามและปัญหาประสิทธิภาพ
สมาคม Polymorphic ทำให้การสืบค้นซับซ้อนเนื่องจากแบบสอบถามทุกครั้งจะต้องกรองโดยทั้งรหัสคีย์ต่างประเทศและคอลัมน์ประเภท ตัวอย่างเช่นการดึงความคิดเห็นสำหรับประเภททรัพยากรที่เฉพาะเจาะจงจำเป็นต้องระบุประเภทของรุ่นควบคู่ไปกับ ID เงื่อนไขสารประกอบนี้มักจะส่งผลให้มีการสืบค้นที่ไม่มีประสิทธิภาพซึ่งทำให้เป็นเรื่องยากสำหรับเครื่องมือเพิ่มประสิทธิภาพฐานข้อมูลที่จะใช้ดัชนีได้อย่างมีประสิทธิภาพซึ่งจะทำให้การดำเนินการแบบสอบถามช้าลงโดยเฉพาะอย่างยิ่งเมื่อปริมาณข้อมูลเพิ่มขึ้น ดัชนีคอมโพสิตในคอลัมน์ประเภทและ ID เป็นสิ่งจำเป็น แต่อาจเป็นการยากที่จะปรับให้เหมาะสม คอลัมน์ประเภทที่ใช้สตริงนั้นเพิ่มค่าใช้จ่ายในการจัดทำดัชนีและใช้พื้นที่เก็บข้อมูลมากขึ้นเมื่อเทียบกับคีย์จำนวนเต็มเท่านั้นซึ่งอาจทำให้ประสิทธิภาพฐานข้อมูลโดยรวมลดลง
การละเมิดฐานข้อมูลการทำให้เป็นมาตรฐานและหลักการความรับผิดชอบเดี่ยว
ด้วยการจัดเก็บความสัมพันธ์ที่ไม่เกี่ยวข้องหลายครั้งในตารางเดียวกันความสัมพันธ์ของ polymorphic จะทำลายหลักการของความรับผิดชอบเดี่ยวในการออกแบบฐานข้อมูล ตารางกลายเป็นสิ่งที่จับได้สำหรับรุ่นที่แตกต่างกันซึ่งสามารถมีชุดแอตทริบิวต์และข้อ จำกัด ที่แตกต่างกัน สิ่งนี้ละเมิดหลักการทำให้เป็นมาตรฐานทำให้สคีมามีความชัดเจนน้อยลงและยากที่จะบังคับใช้หรือตรวจสอบความถูกต้องในระดับฐานข้อมูล Polymorphic Fields จัดเก็บข้อมูลที่เป็นตัวแทนของหน่วยงานต่าง ๆ ที่มีความหมายที่แตกต่างกันและความต้องการความสมบูรณ์ซึ่งทำให้การจัดการสคีมามีความซับซ้อนและเพิ่มความเสี่ยงของข้อบกพร่องหรือความผิดปกติของข้อมูล
เพิ่มความซับซ้อนในการบำรุงรักษาและความยุ่งเหยิงของรหัส
การใช้ความสัมพันธ์แบบ polymorphic มักจะนำไปสู่ตรรกะการใช้งานที่ซับซ้อน ตัวอย่างเช่นการตรวจสอบความถูกต้องของอินพุตตะขออายุการใช้งานแบบจำลองและกฎทางธุรกิจอาจจำเป็นต้องจัดการกับรุ่นโมเดลที่แตกต่างกันอย่างมีเงื่อนไขภายในโมเดล polymorphic เดียว สิ่งนี้สามารถทำให้รหัสกลายเป็นความยุ่งเหยิงด้วยการตรวจสอบเงื่อนไขเฉพาะประเภทลดความสามารถในการอ่านและการบำรุงรักษา เมื่อแบบจำลองพัฒนาไปตามข้อกำหนดที่แตกต่างกันโมเดล polymorphic เดียวมีแนวโน้มที่จะสะสมความรับผิดชอบที่ยากต่อการแยกส่งผลให้หนี้ทางเทคนิค
ความท้าทายด้วยข้อ จำกัด การโหลดและข้อ จำกัด ของ ORM
เฟรมเวิร์ก ORM อย่าง Laravel มีข้อ จำกัด เมื่อทำงานกับการเชื่อมโยง polymorphic โดยเฉพาะอย่างยิ่งรอบ ๆ การโหลดที่กระตือรือร้น เนื่องจากความสัมพันธ์แบบ polymorphic เชื่อมโยงหลายประเภทแบบไดนามิก ORM จึงไม่สามารถทำการโหลดกระตือรือร้นที่ดีที่สุดด้วยการรวมเข้าด้วยกันสำหรับทุกประเภทที่เกี่ยวข้องในแบบสอบถามเดียว ข้อ จำกัด นี้บังคับให้มีการสืบค้นเพิ่มเติมหรือรหัสวิธีแก้ปัญหาที่ซับซ้อนเพื่อหลีกเลี่ยงปัญหาการสืบค้น n+1 เพิ่มไปยังภาระการพัฒนาและประสิทธิภาพ
ความยากลำบากในการบังคับใช้ข้อ จำกัด และการจัดทำดัชนีที่ไม่ซ้ำกัน
การเขียนดัชนีหรือข้อ จำกัด ที่ไม่ซ้ำกันซึ่งขยายความสัมพันธ์แบบ polymorphic นั้นยากหรือเป็นไปไม่ได้เนื่องจากตัวแปรและลักษณะคอมโพสิตของคีย์ที่เกี่ยวข้อง ตัวอย่างเช่นการรับประกันชุดค่าผสมที่ไม่ซ้ำกันบนปุ่ม polymorphic ต้องใช้ดัชนีคอมโพสิตทั้งในคอลัมน์ประเภทและคอลัมน์ ID ซึ่งอาจยุ่งยากในการออกแบบและบำรุงรักษา ยิ่งไปกว่านั้นคอลัมน์ประเภทสตริงที่ทำดัชนีจะช้าลงเมื่อเทียบกับปุ่มต่างประเทศจำนวนเต็มและใช้พื้นที่จัดเก็บมากขึ้นเพิ่มต้นทุนการสืบค้น
พื้นที่ฐานข้อมูลที่สูญเปล่าเนื่องจากคอลัมน์ประเภทสตริง
การเชื่อมโยง Polymorphic ใช้คอลัมน์สตริงเพื่อเก็บชื่อคลาสของโมเดลที่เกี่ยวข้องซึ่งโดยทั่วไปจะใช้เวลานานกว่าและใช้เวลานานกว่าคีย์ต่างประเทศจำนวนเต็ม พื้นที่ที่สูญเปล่านี้มีความสำคัญมากกว่าหลายล้านแถว การจัดเก็บชื่อประเภทที่ซ้ำซ้อนและยาวพองขนาดของตารางและสามารถนำไปสู่การเพิ่มค่าใช้จ่าย I/O ในระหว่างการอ่านและเขียน
ความเสี่ยงของข้อมูลค้างหรือกำพร้าเนื่องจากขาดการลบแบบเรียงซ้อนกัน
เนื่องจากฐานข้อมูลไม่สามารถบังคับใช้ข้อ จำกัด ของคีย์ต่างประเทศด้วยการลบ cascading ในการเชื่อมโยง polymorphic จึงเป็นเรื่องง่ายที่จะสะสมเร็กคอร์ดเก่าเมื่อลบเอนทิตีของผู้ปกครอง ความรับผิดชอบในการทำความสะอาดนั้นอยู่ในรหัสแอปพลิเคชันทั้งหมดเพิ่มความเสี่ยงในการลืมลบบันทึก polymorphic ที่ขึ้นอยู่กับซึ่งอาจคงอยู่เป็นข้อมูลเด็กกำพร้าหรือไม่ถูกต้อง
การสืบค้นที่ จำกัด และการรายงานที่ซับซ้อน
การจัดเก็บความสัมพันธ์ที่แตกต่างกันภายในตาราง polymorphic ทำให้การรายงานและแบบสอบถามรวมมีความซับซ้อน การสืบค้นการกรองหรือการจัดกลุ่มโดยทั่วไปมีความซับซ้อนมากขึ้นเนื่องจากบันทึกที่เกี่ยวข้องเป็นของตารางหรือประเภทที่แตกต่างกันซึ่งต้องการตรรกะเพิ่มเติมเพื่อรวมหรือแยกแยะความแตกต่างในแบบสอบถาม ธรรมชาติที่กระจัดกระจายนี้ทำให้ความสามารถในการวิเคราะห์ที่มีความหมายมีประสิทธิภาพ
ทางเลือกที่ต้องการมากกว่าสมาคม polymorphic
เนื่องจากข้อเสียที่กล่าวถึงดังกล่าวนักพัฒนามักจะแนะนำทางเลือกให้กับการเชื่อมโยง polymorphic เพื่อให้ได้ความสมบูรณ์ของข้อมูลที่ดีขึ้นและการบำรุงรักษาที่ง่ายขึ้น:
- ตารางความสัมพันธ์แยกต่างหาก: แทนที่จะเป็นตาราง polymorphic เดียวใช้ตารางแยกต่างหากที่มีปุ่มต่างประเทศที่ชัดเจนสำหรับแต่ละประเภทความสัมพันธ์ สิ่งนี้จะรักษาความสมบูรณ์ของข้อมูลด้วยข้อ จำกัด ฐานข้อมูลดั้งเดิมและทำให้การสืบค้นและการจัดทำดัชนีง่ายขึ้น
- การสืบทอดตารางเดี่ยว (STI) หรือการสืบทอดตารางคลาส (CTI): วิธีการเหล่านี้แบบจำลองลำดับชั้นการสืบทอดอย่างชัดเจนมากขึ้นและสามารถลดความซับซ้อนของ polymorphic บางอย่างแม้ว่าพวกเขาจะมีข้อ จำกัด และอาจเพิ่มความซับซ้อนในพื้นที่อื่น ๆ
- องค์ประกอบมากกว่าการสืบทอด: ความโปรดปรานองค์ประกอบที่ข้อมูลที่เกี่ยวข้องถูกห่อหุ้มในรูปแบบและความสัมพันธ์เฉพาะการปรับปรุงความชัดเจนและการบำรุงรักษา