मुसीबत
नोट: मैं गणितीय अनुक्रमों का उल्लेख करता हूं , न कि पोस्टग्रेक्यूएल के अनुक्रम तंत्र का ।
मेरे पास पूर्णांकों के अनुक्रमों को दर्शाने वाली एक तालिका है। परिभाषा है:
CREATE TABLE sequences
(
id serial NOT NULL,
title character varying(255) NOT NULL,
date date NOT NULL,
sequence integer[] NOT NULL,
CONSTRAINT "PRIM_KEY_SEQUENCES" PRIMARY KEY (id)
);
मेरा लक्ष्य किसी दिए गए परिणाम का उपयोग करके पंक्तियों को खोजना है। यह कहना है, पंक्तियों जहाँ sequence
फ़ील्ड एक अनुक्रम है जिसमें दी गई अनुवर्ती (मेरे मामले में, अनुक्रम का आदेश दिया गया है) शामिल है।
उदाहरण
मान लीजिए कि तालिका में निम्नलिखित डेटा हैं:
+----+-------+------------+-------------------------------+
| id | title | date | sequence |
+----+-------+------------+-------------------------------+
| 1 | BG703 | 2004-12-24 | {1,3,17,25,377,424,242,1234} |
| 2 | BG256 | 2005-05-11 | {5,7,12,742,225,547,2142,223} |
| 3 | BD404 | 2004-10-13 | {3,4,12,5698,526} |
| 4 | BK956 | 2004-08-17 | {12,4,3,17,25,377,456,25} |
+----+-------+------------+-------------------------------+
इसलिए यदि दी गई अनुवर्तीता है {12, 742, 225, 547}
, तो मैं पंक्ति 2 को खोजना चाहता हूं।
इसी प्रकार, यदि दी गई अनुवर्तीता है {3, 17, 25, 377}
, तो मैं पंक्ति 1 और पंक्ति 4 को खोजना चाहता हूं।
अंत में, यदि दी गई प्रक्रिया है {12, 4, 3, 25, 377}
, तो कोई पंक्तियाँ वापस नहीं आती हैं।
जांच
सबसे पहले, मैं पूरी तरह से निश्चित नहीं हूं कि एक सरणी डेटा प्रकार के साथ दृश्यों का प्रतिनिधित्व बुद्धिमान है। यद्यपि यह स्थिति के लिए उचित लगता है; मुझे डर है कि यह अधिक जटिल हैंडलिंग बनाता है। शायद दूसरे तालिका के साथ संबंधों के एक मॉडल का उपयोग करते हुए, अनुक्रमों को अलग ढंग से प्रस्तुत करना बेहतर होता है।
उसी तरह, मैं unnest
सरणी फ़ंक्शन का उपयोग करके अनुक्रमों का विस्तार करने के बारे में सोचता हूं और फिर अपने खोज मापदंड जोड़ता हूं। फिर भी, अनुक्रम में शर्तों की संख्या चर जा रहा है मैं यह नहीं देखता कि यह कैसे करना है।
मुझे पता है कि अंतःप्रेरण मॉड्यूल के subarray
कार्य का उपयोग करके मेरे अनुक्रम में कटौती करना भी संभव है लेकिन मुझे यह नहीं दिखता है कि यह मेरी खोज के लिए मुझे कैसे लाभ पहुंचाता है ।
प्रतिबन्ध
यहां तक कि अगर इस समय मेरा मॉडल अभी भी विकसित हो रहा है, तो तालिका 50,000 और 300,000 पंक्तियों के बीच कई अनुक्रमों से बना है। इसलिए मेरे पास एक मजबूत प्रदर्शन बाधा है।
मेरे उदाहरण में मैंने अपेक्षाकृत छोटे पूर्णांकों का उपयोग किया है। व्यवहार में, यह संभव है कि ये पूर्णांक बहुत बड़े हो जाएं, अतिप्रवाह तक bigint
। ऐसी स्थिति में, मुझे लगता है कि संख्याओं को स्ट्रिंग्स के रूप में संग्रहीत करना सबसे अच्छा है (क्योंकि गणितीय कार्यों के इन अनुक्रमों को निष्पादित करना आवश्यक नहीं है)। हालांकि, इस समाधान के लिए चुनने पर, यह ऊपर वर्णित अंतरंग मॉड्यूल का उपयोग करना असंभव बनाता है ।
numeric
एक स्ट्रिंग ( text
उदाहरण के लिए) का उपयोग क्यों और नहीं ? मुझे अपने अनुक्रमों पर गणितीय कार्य करने की आवश्यकता नहीं है।
text
, और आपको फर्जी गैर-संख्यात्मक डेटा संग्रहीत करने से रोकता है। निर्भर करता है, यदि आप केवल I / O कर रहे हैं, तो आप I / O संसाधन को कम करने के लिए पाठ चाहते हैं।
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
सही लौटेगा, क्योंकि इस ऑपरेटर द्वारा आदेश नहीं माना जाता है।
bigint
कर सकते हैं तो आपकोnumeric
उन्हें स्टोर करने के प्रकार के रूप में उपयोग करना चाहिए । यह बहुत धीमा है और रास्ते में अधिक जगह लेता है।