अनुरोध के अनुसार समाधान
इस दुर्भाग्यपूर्ण डिज़ाइन के साथ अटके रहने पर, सबसे तेज़ क्वेरी crosstab()
. के साथ होगी , अतिरिक्त मॉड्यूल tablefunc
. द्वारा प्रदान किया गया . इस संबंधित उत्तर में पर्याप्त विवरण:
पूछे गए प्रश्न के लिए:
SELECT * FROM crosstab(
$$SELECT e.id, ef.name, ef.value
FROM entry e
LEFT JOIN entry_fields ef
ON ef.entryid = e.id
AND ef.name = ANY ('{result,output,code,command}'::text[])
ORDER BY 1, 2$$
,$$SELECT unnest('{result,output,code,command}'::text[])$$
) AS ct (id int, result text, output text, code text, command text);
डेटाबेस डिज़ाइन
यदि आपके पास विशाल . नहीं है विभिन्न क्षेत्रों की संख्या, यह बहुत सरल और अधिक कुशल . होगा तीनों टेबल को एक साधारण टेबल में मर्ज करने के लिए:
CREATE TABLE entry (
entry_id serial PRIMARY KEY
,field1 text
,field2 text
, ... more fields
);
बिना मान वाले फ़ील्ड NULL
हो सकते हैं . NULL
संग्रहण बहुत सस्ता है (मूल रूप से NULL बिटमैप में प्रति कॉलम 1 बिट):
- पोस्टग्रेस्क्ल डीबी का उपयोग करके एक NULL मान को स्टोर करने के लिए कितने डिस्क-स्पेस की आवश्यकता है?
- अशक्त करें PostgreSQL में कॉलम अतिरिक्त स्थान घेरते हैं?
यहां तक कि अगर आपके पास सैकड़ों अलग-अलग कॉलम हैं, और प्रति प्रविष्टि केवल कुछ ही भरे हुए हैं, तब भी यह बहुत कम डिस्क स्थान का उपयोग करेगा।
आपकी क्वेरी तुच्छ हो जाती है:
SELECT entry_id, result, output, code, command
FROM enty;
यदि आपके पास बहुत अधिक स्तंभ हैं, और यह केवल एक पथभ्रष्ट डिज़ाइन नहीं है (अक्सर, इसे बहुत कम स्तंभों में मोड़ा जा सकता है), तो डेटा प्रकारों पर विचार करें hstore
या json
/ jsonb
(पोस्टग्रेज 9.4 में) EAV के लिए
भंडारण।
प्रति पोस्टग्रेज "अबाउट" पेज :
Maximum Columns per Table 250 - 1600 depending on column types
विकल्पों के साथ इस संबंधित उत्तर पर विचार करें:
और dba.SE पर ईएवी संरचनाओं के विशिष्ट उपयोग के मामलों/समस्याओं के बारे में यह प्रश्न: