สมมติว่าเอนทิตีผลิตภัณฑ์ของร้านค้ามีคุณสมบัติทั่วไปเช่นชื่อคำอธิบายรูปภาพราคาและอื่น ๆ ที่มีส่วนร่วมในหลาย ๆ ตรรกะและมีคุณสมบัติที่เป็นเอกลักษณ์ (กึ่ง) เช่นนาฬิกาและลูกบอลชายหาดจะอธิบายโดยแง่มุมที่แตกต่างกันโดยสิ้นเชิง . ดังนั้นฉันคิดว่า EAV จะเหมาะสำหรับการจัดเก็บคุณลักษณะเฉพาะ (กึ่ง) เหล่านั้นหรือไม่
การใช้โครงสร้าง EAV สำหรับมีความหมายหลายอย่างที่ไม่ชอบ
คุณกำลังค้าขาย 'พื้นที่น้อยกว่าสำหรับแถวเพราะคุณไม่มี 100 คอลัมน์ที่null
' ต่อต้าน 'คำค้นหาและแบบจำลองที่ซับซ้อนยิ่งขึ้น'
โดยทั่วไปแล้วการมี EAV หมายถึงค่าเป็นสตริงที่สามารถบรรจุข้อมูลใด ๆ ลงไปได้ สิ่งนี้มีผลกระทบต่อการตรวจสอบความถูกต้องและข้อ จำกัด พิจารณาสถานการณ์ที่คุณใส่จำนวนแบตเตอรี่ที่ใช้เป็นบางอย่างในตาราง EAV คุณต้องการหาไฟฉายที่ใช้แบตเตอรี่ขนาด C แต่น้อยกว่า 4 ในนั้น
select P.sku
from
products P
attrib Ab on (P.sku = Ab.sku and Ab.key = "batteries")
attrib Ac on (P.sku = Ac.sku and Ac.key = "count")
where
cast(Ac.value as int) < 4
and Ab.value = 'C'
...
สิ่งที่ต้องตระหนักถึงที่นี่คือคุณไม่สามารถใช้ดัชนีอย่างสมเหตุสมผลกับมูลค่า คุณไม่สามารถป้องกันไม่ให้ใครบางคนใส่สิ่งที่ไม่ใช่จำนวนเต็มหรือจำนวนเต็มไม่ถูกต้อง (ใช้แบตเตอรี่ '-1') เนื่องจากคอลัมน์ค่าจะใช้อีกครั้งและอีกครั้งเพื่อจุดประสงค์ที่แตกต่างกัน
สิ่งนี้มีความหมายในการพยายามเขียนแบบจำลองสำหรับผลิตภัณฑ์ คุณจะได้คุณค่าที่ดีในการพิมพ์ ... แต่คุณก็จะต้องMap<String,String>
นั่งอยู่ตรงนั้นพร้อมกับของทุกอย่างในนั้น สิ่งนี้มีความเกี่ยวข้องเพิ่มเติมเมื่อทำการซีเรียลไลซ์เป็น XML หรือ Json และความซับซ้อนของการพยายามตรวจสอบหรือสอบถามกับโครงสร้างเหล่านั้น
ทางเลือกหรือการดัดแปลงรูปแบบที่ต้องพิจารณาแทนการใช้รหัสรูปแบบอิสระเพื่อให้มีอีกตารางหนึ่งที่มีคีย์ที่ถูกต้อง มันหมายถึงแทนที่จะทำการเปรียบเทียบสตริงในฐานข้อมูลคุณกำลังตรวจสอบความเท่าเทียมกันของรหัสต่างประเทศ การเปลี่ยนรหัสเองทำได้ในจุดเดียว คุณมีชุดของคีย์ที่รู้จักซึ่งหมายความว่าพวกเขาสามารถทำได้เป็น enum
คุณอาจมีตารางที่เกี่ยวข้องซึ่งมีคุณลักษณะของคลาสผลิตภัณฑ์เฉพาะ แผนกขายของชำอาจมีตารางอื่นที่มีคุณลักษณะหลายอย่างที่เกี่ยวข้องกับวัสดุก่อสร้างที่ไม่ต้องการ (และในทางกลับกัน)
+----------+ +--------+ +---------+
|Grocery | |Product | |BuildMat |
|id (fk) +--->|id (pk) |<---+id (fk) |
|expiration| |desc | |material |
|... | |img | |... |
+----------+ |price | +---------+
|... |
+--------+
มีบางครั้งที่ต้องเรียกใช้ตาราง EAV โดยเฉพาะ
พิจารณาสถานการณ์ที่คุณไม่เพียงแค่เขียนระบบสินค้าคงคลังสำหรับ บริษัท ของคุณที่คุณรู้จักทุกผลิตภัณฑ์และทุกคุณสมบัติ ตอนนี้คุณกำลังเขียนระบบสินค้าคงคลังเพื่อขายให้กับ บริษัท อื่น คุณไม่สามารถรู้ได้ทุกคุณสมบัติของทุกผลิตภัณฑ์ - พวกเขาจะต้องกำหนด
หนึ่งความคิดที่ออกมาคือ "เราจะแจ้งให้ลูกค้าปรับเปลี่ยนตาราง" และนี่คือที่ไม่ดีเพียง (คุณได้รับใน meta-การเขียนโปรแกรมสำหรับโครงสร้างตารางเพราะคุณไม่ได้รู้ว่าสิ่งที่เป็นที่ที่พวกเขาสามารถพระราชทานเลอะโครงสร้างหรือเสียหาย แอปพลิเคชันพวกเขามีสิทธิ์เข้าถึงในการทำสิ่งที่ผิดและความหมายของการเข้าถึงนั้นมีความสำคัญมาก) มีข้อมูลเพิ่มเติมเกี่ยวกับเส้นทางนี้ที่MVC4: วิธีสร้างแบบจำลองในเวลาทำงาน
คุณสร้างอินเทอร์เฟซการดูแลระบบแทนตาราง EAV แทนและอนุญาตให้ใช้ หากลูกค้าต้องการสร้างรายการสำหรับ 'polkadots' มันจะเข้าไปในตาราง EAV และคุณรู้วิธีจัดการกับมันแล้ว
ตัวอย่างนี้สามารถเห็นได้ในโมเดลฐานข้อมูลสำหรับ Redmineคุณสามารถดูตาราง custom_fields และตาราง custom_values ซึ่งเป็นส่วนหนึ่งของ EAV ที่อนุญาตให้ขยายระบบ
โปรดทราบว่าหากคุณพบว่าโครงสร้างตารางทั้งหมดของคุณดูเหมือน EAV แทนที่จะเป็นเชิงสัมพันธ์คุณอาจต้องการดูรสชาติ KV ของ NoSQL (คาสซานดรา, เรดิส, Mongo ,. ... ) ตระหนักว่าสิ่งเหล่านี้มักจะมาพร้อมกับการแลกเปลี่ยนอื่น ๆในการออกแบบของพวกเขาที่อาจหรืออาจไม่เหมาะสมกับสิ่งที่คุณใช้ อย่างไรก็ตามได้รับการออกแบบมาโดยเฉพาะด้วยความตั้งใจของโครงสร้าง EAV
คุณอาจต้องการอ่านSQL vs NoSQL สำหรับระบบการจัดการสินค้าคงคลัง
ทำตามวิธีนี้กับฐานข้อมูล NoSQL เอกสาร (โซฟา, mongo), คุณสามารถพิจารณาแต่ละรายการสินค้าคงคลังเป็นเอกสารบนดิสก์ ... ดึงทุกอย่างในเอกสารเดียวได้อย่างรวดเร็ว นอกจากนี้เอกสารยังมีโครงสร้างเพื่อให้คุณสามารถดึงสิ่งใดสิ่งหนึ่งที่รวดเร็ว ในทางกลับกันการค้นหาเอกสารทั้งหมดเพื่อหาสิ่งที่ตรงกับแอตทริบิวต์เฉพาะสามารถมีประสิทธิภาพน้อยลง (เปรียบเทียบการใช้ 'grep' กับไฟล์ทั้งหมด) ... ทั้งหมดเป็นการแลกเปลี่ยน
อีกวิธีหนึ่งคือ LDAP โดยที่หนึ่งจะมีฐานที่มีรายการที่เกี่ยวข้องทั้งหมด แต่จะมีคลาสวัตถุเพิ่มเติมที่ใช้กับรายการประเภทอื่น ๆ (ดูระบบสินค้าคงคลังโดยใช้ LDAP )
เมื่อคุณไปตามเส้นทางนี้คุณอาจพบสิ่งที่ตรงกับสิ่งที่คุณกำลังมองหา ... แม้ว่าทุกอย่างจะมาพร้อมกับการแลกเปลี่ยนบางอย่าง