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
with के साथ एक और फल डालें और 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;
परिणाम:
+-------+
| id |
+-------+
| mango |
+-------+
1 row in set (0.00 sec)
जैसा कि हर दृष्टिकोण में होता है, ईएवी मॉडल का उपयोग करते समय कुछ फायदे और नुकसान होते हैं। सुनिश्चित करें कि आपने अपने आवेदन के संदर्भ में विषय पर व्यापक शोध किया है। आप वैकल्पिक संबंधपरक डेटाबेस पर भी विचार कर सकते हैं, जैसे Cassandra , CouchDB , MongoDB , Voldemort , HBase , SimpleDB या अन्य महत्वपूर्ण मूल्य स्टोर।