EAV डिज़ाइन है असामान्य। यानी यह एक गैर-संबंधपरक डिजाइन है। सामान्यीकरण का कोई नियम नहीं है जो आपको EAV डिज़ाइन का उपयोग करने के लिए प्रेरित करे।
एसक्यूएल की आवश्यकता है कि जब आप क्वेरी लिखते हैं तो आप कॉलम जानते हैं, और यह भी कि परिणाम सेट की प्रत्येक पंक्ति में समान कॉलम होते हैं। ईएवी के साथ, एकमात्र समाधान यदि आप नहीं जानते कि प्रति आइटम कितने फ़ील्ड उन्हें पंक्तियों के रूप में वापस लाना है, न कि कॉलम।
SELECT i.ItemID, i.ItemName, f.FieldName, v.Value
FROM Items i
JOIN FieldsValues v4 ON (v4.ItemID, v4.FieldID, v4.Value) = (i.ItemID, 4, TRUE)
JOIN FieldsValues v ON i.ItemID = v.ItemID
JOIN Fields f ON v.FieldID = f.FieldID;
आपको अपने आवेदन में पंक्तियों को संसाधित करना होगा। उदाहरण के लिए, PHP के साथ:
<?php
$pdo = new PDO(...);
$sql = "...above query...";
$collection = array();
foreach ($pdo->query($sql) as $row) {
$id = $row["ItemID"];
if (!array_key_exists($id, $collection)) {
$collection[$id] = new stdClass();
$collection[$id]->Name = $row["ItemName"];
}
$collection[$id]->$row["FieldName"] = $row["Value"];
}
अब आपके पास ऑब्जेक्ट्स की एक सरणी है, और प्रत्येक ऑब्जेक्ट डेटाबेस से किसी आइटम से मेल खाता है। प्रत्येक वस्तु का अपना संबंधित क्षेत्र होता है।