สำหรับฉันไม่ว่าคุณจะไปแถวเดียวหรือ EAV ขึ้นอยู่กับว่าคุณต้องการบริโภคมันอย่างไร
พลังของ EAV คือสามารถเพิ่มข้อมูลใหม่ได้โดยไม่มีการเปลี่ยนแปลงโครงสร้าง ซึ่งหมายความว่าหากคุณต้องการค่าการกำหนดค่าใหม่คุณเพียงแค่เพิ่มลงในตารางและดึงออกมาในตำแหน่งที่คุณต้องการในรหัสและคุณไม่จำเป็นต้องเพิ่มเขตข้อมูลใหม่ในโดเมน schema การแมปแบบสอบถาม DAL ฯลฯ
ข้อบกพร่องของมันคือมันมีเพียงโครงสร้างที่แทบจะไม่ต้องการให้คุณจัดการกับข้อมูลในแง่ร้าย ทุกการใช้งานของค่าการกำหนดค่าใด ๆ จะต้องคาดหวังว่าค่าจะไม่มีอยู่หรือไม่อยู่ในรูปแบบที่เหมาะสมและทำงานตามนั้นเมื่อไม่มี ค่าการกำหนดอาจไม่สามารถแยกวิเคราะห์เป็น double หรือ int หรือ char อาจเป็นโมฆะ อาจไม่มีแถวสำหรับค่าเลย วิธีที่รอบนี้มักจะต้องเป็นหนึ่งเดียวที่ถูกต้อง "เริ่มต้น" มูลค่าให้กับที่มีอยู่สำหรับค่าการตั้งค่าทั้งหมดของโดยเฉพาะอย่างยิ่งพิมพ์รหัส ( มากหายากมากขึ้นมักจะมีค่าเริ่มต้นเป็นเพียงเป็นปัญหาสำหรับรหัสบริโภคเป็นไม่มีเลย) หรือ เก็บ hardcoded dictionary ของค่าเริ่มต้น (ซึ่งจะต้องเปลี่ยนทุกครั้งที่มีการเพิ่มคอลัมน์ใหม่ทำให้ข้อได้เปรียบหลักของการจัดเก็บ EAV ดูน่าสนใจ)
แถวกว้างเดี่ยวค่อนข้างตรงกันข้าม คุณแมปกับอินสแตนซ์เดียวของวัตถุการกำหนดค่าด้วยเขตข้อมูล / คุณสมบัติสำหรับทุกค่าการกำหนดค่าที่มีอยู่ คุณรู้แน่ชัดว่าค่าเหล่านั้นควรเป็นประเภทใดในเวลารวบรวมและคุณ "ล้มเหลวเร็ว" ใน DAL หากไม่มีคอลัมน์กำหนดค่าหรือไม่มีค่าประเภทที่เหมาะสม เกี่ยวกับปัญหาการเรียกคืน / การทำไฮเดรชั่น
ข้อเสียเปรียบหลักคือการเปลี่ยนแปลงโครงสร้างจำเป็นสำหรับค่าใหม่แต่ละค่า คอลัมน์ DB ใหม่คอลัมน์ใหม่ใน DAL (ทั้งการแมปหรือการสืบค้น SQL / SPs) คอลัมน์โดเมนใหม่ทั้งหมดที่จำเป็นในการทดสอบการใช้งานอย่างถูกต้อง
สถานการณ์ที่เหมาะสมที่จะใช้อย่างใดอย่างหนึ่งต่อไปนี้เป็นสถานการณ์ที่ข้อเสียจะลดลง สำหรับฉันสถานการณ์ส่วนใหญ่สำหรับการกำหนดค่าการเข้ารหัสได้เรียกร้องให้มีการใช้งานแบบแถวเดียว นี่เป็นส่วนใหญ่เพราะหากคุณแนะนำค่าการตั้งค่าใหม่ทั้งหมดที่ควบคุมพฤติกรรมของบางส่วนของโปรแกรมของคุณคุณต้องเปลี่ยนรหัสเพื่อใช้ค่าการกำหนดค่าใหม่ เหตุใดจึงไม่ปรากฏในวัตถุกำหนดค่าและเพิ่มมูลค่าที่จะใช้
ในระยะสั้น EAV schema เพื่อจัดเก็บการกำหนดค่าจริงๆไม่ได้แก้ปัญหาที่อ้างว่าจะแก้ปัญหาและส่วนใหญ่ของการแก้ไขปัญหาที่นำเสนอละเมิด DRY