entity-attribute-value मॉडल जो आप सुझाते हैं वह इस परिदृश्य में फिट हो सकता है।
फ़िल्टरिंग क्वेरी के संबंध में, आपको यह समझना होगा कि ईएवी मॉडल के साथ आप बहुत सारी क्वेरी पावर का त्याग करेंगे, इसलिए यह काफी मुश्किल हो सकता है। हालांकि यह एक तरीका है अपनी समस्या से निपटने के लिए: इस दृष्टिकोण का
SELECT stuff.id
FROM stuff
JOIN (SELECT COUNT(*) matches
FROM table
WHERE (`key` = X1 AND `value` = V1) OR
(`key` = X2 AND `value` = V2)
GROUP BY id
) sub_t ON (sub_t.matches = 2 AND sub_t.id = stuff.id)
GROUP BY stuff.id;
एक असजीला सुविधा है जो आपको विशेषता/मान युग्म है कि आप sub_t.matches = 2
में मिलान की उम्मीद की संख्या निर्दिष्ट करने की आवश्यकता है। अगर हमारे पास तीन स्थितियां थीं तो हमें sub_t.matches = 3
निर्दिष्ट करना होगा, और इसी तरह।
के एक टेस्ट केस का निर्माण करते हैं:
CREATE TABLE stuff (`id` varchar(20), `key` varchar(20), `value` varchar(20));
INSERT INTO stuff VALUES ('apple', 'color', 'red');
INSERT INTO stuff VALUES ('mango', 'color', 'yellow');
INSERT INTO stuff VALUES ('banana', 'color', 'yellow');
INSERT INTO stuff VALUES ('apple', 'taste', 'sweet');
INSERT INTO stuff VALUES ('mango', 'taste', 'sweet');
INSERT INTO stuff VALUES ('banana', 'taste', 'bitter-sweet');
INSERT INTO stuff VALUES ('apple', 'origin', 'US');
INSERT INTO stuff VALUES ('mango', 'origin', 'MEXICO');
INSERT INTO stuff VALUES ('banana', 'origin', 'US');
क्वेरी:
SELECT stuff.id
FROM stuff
JOIN (SELECT COUNT(*) matches, id
FROM stuff
WHERE (`key` = 'color' AND `value` = 'yellow') OR
(`key` = 'taste' AND `value` = 'sweet')
GROUP BY id
) sub_t ON (sub_t.matches = 2 AND sub_t.id = stuff.id)
GROUP BY stuff.id;
परिणाम:
+-------+
| id |
+-------+
| mango |
+-------+
1 row in set (0.02 sec)
अब color=yellow
और taste=sweet
के साथ एक और फल सम्मिलित करते हैं:
INSERT INTO stuff VALUES ('pear', 'color', 'yellow');
INSERT INTO stuff VALUES ('pear', 'taste', 'sweet');
INSERT INTO stuff VALUES ('pear', 'origin', 'somewhere');
समान क्वेरी वापसी होगी:
+-------+
| id |
+-------+
| mango |
| pear |
+-------+
2 rows in set (0.00 sec)
हम origin=MEXICO
साथ संस्थाओं के लिए इस परिणाम को प्रतिबंधित करना चाहते हैं, तो हम एक और OR
हालत जोड़ सकते हैं और sub_t.matches = 3
बजाय 2
के लिए जाँच करने के लिए होगा।
SELECT stuff.id
FROM stuff
JOIN (SELECT COUNT(*) matches, id
FROM stuff
WHERE (`key` = 'color' AND `value` = 'yellow') OR
(`key` = 'taste' AND `value` = 'sweet') OR
(`key` = 'origin' AND `value` = 'MEXICO')
GROUP BY id
) sub_t ON (sub_t.matches = 3 AND sub_t.id = stuff.id)
GROUP BY stuff.id;
परिणाम:
जब EAV मॉडल का उपयोग कर
+-------+
| id |
+-------+
| mango |
+-------+
1 row in set (0.00 sec)
हर दृष्टिकोण के रूप में, वहाँ कुछ फायदे और नुकसान हैं। सुनिश्चित करें कि आप अपने आवेदन के संदर्भ में व्यापक रूप से विषय का शोध करें। आप Cassandra, CouchDB, MongoDB, Voldemort, HBase, SimpleDB या अन्य प्रमुख-मूल्य वाले स्टोर जैसे वैकल्पिक संबंधपरक डेटाबेस पर भी विचार करना चाहेंगे।
ऐसा नहीं है कि रेडिट ईवा बड़े पैमाने पर उपयोग करता है मेरे आश्चर्य करने के लिए है। http://carsonified.com/blog/dev/steve-huffman-on-lessons-learned-at-reddit/ – crapbag