2012-06-05 16 views
6

में मोंगोडीबी कैप्ड संग्रह समकक्ष संग्रह मोंगोडीबी के संग्रह की बहुत मूल बातें यह है कि वे आपको तालिका का अधिकतम आकार सेट करने देते हैं और आकार सीमा तक पहुंचने पर सिस्टम पुराने डेटा को साफ़ कर देगा।पोस्टग्रेएसक्यूएल

क्या कोई भी पोस्टग्रेएसक्यूएल में इसी तरह के सेटअप के साथ आया है और इसे उत्पादन में उपयोग किया है?

+1

विभाजन को लागू करें और प्रोग्राम के रूप में पुराने विभाजन छोड़ने और केवल सबसे हाल ही में एक काम हो सकता है रखे हुए हैं। सैद्धांतिक रूप से इसे तालिका से पंक्तियों को हटाने से बेहतर तरीके से प्रदर्शन करना चाहिए। – Marquez

उत्तर

3

इस तरह के कुछ भी नहीं सुना है। मुझे लगता है कि आप का उपयोग करके एक छाया हुआ तालिका आकार या परिपत्र कतार अनुकरण कर सकते हैं:

  • upserts
  • और एक सापेक्ष ऑपरेटर एक दृश्य पर (कैसे मर्ज/Upsert करने के बारे में एक स्पष्टीकरण के लिए Insert, on duplicate update in PostgreSQL? देखें)

विशेष रूप से दिलचस्प (मेरे परिप्रेक्ष्य से) बोवाइन की प्रतिक्रिया है (यानी गैर स्वीकार्य उत्तरों को देखें)।

तालिका में एक कॉलम की शुरूआत "संग्रह" और स्तंभ के लिए एक दृश्य में सूचकांक का प्रतिनिधित्व करने के साथ

, प्रत्येक Upsert स्थिति के आधार पर किया जा सकता है:

where index = (sequence.nextval % max collection size) 
+4

वास्तव में, अनुक्रम को अधिकतम संग्रह आकार का एक साइक्ल मान बनाते हैं। यह आपको एक अपरिवर्तित ट्रिगर का उपयोग करने देता है जो केवल अगली बार लेता है और अद्यतन/सम्मिलित करता है। – reedstrm

3

यहाँ एक सरल समाधान है इसके लिए, ऐसे मामलों के लिए जहां डेटा का आकार बहुत बड़ा नहीं है और प्रदर्शन आवश्यकताओं को बहुत कठिन नहीं है।

सबसे पहले, आइए अपनी तालिका बनाएं। हमारे पास एक आईडी कॉलम और डेटा कॉलम होगा, लेकिन आपके पास अपनी विशेष स्थिति के लिए आवश्यक कॉलम हो सकते हैं।

CREATE TABLE capped_collection (
    id integer NOT NULL, 
    data text); 

अब, हम, हमारी प्राथमिक कुंजी के लिए एक दृश्य बनाने के MAXVALUE सेट हमारे छाया हुआ संग्रह का इच्छित आकार होने के लिए, और हम CYCLE विकल्प का उपयोग, ताकि अनुक्रम MAXVALUE और उसके बाद पुनः आरंभ करने के लिए गणना की जाएगी फिर से 1.

CREATE SEQUENCE capped_collection_id_seq 
    START WITH 1 
    INCREMENT BY 1 
    MINVALUE 1 
    MAXVALUE 10000 
    CACHE 1 
    CYCLE 
    OWNED BY capped_collection.id; 

अगले कदम (यहाँ नहीं दिखाया गया है) में, आप MAXVALUE रिकॉर्ड के साथ-बीज पूर्व चाहिए तालिका। हम ऐसा करते हैं ताकि प्रत्येक आईडी मान में एक पंक्ति हो, और हमें यह तय करने की आवश्यकता नहीं है कि आईएनएसईआरटी या अद्यतन ऑपरेशन करना है या नहीं, बस चीजों को सरल और निष्पादित रखने के लिए।

अब जब कि हमारे टेबल की स्थापना की है, जब भी हम एक नई पंक्ति सम्मिलित करना चाहते हैं, लेकिन इसके बदले हम तो

UPDATE capped_collection 
SET data = 'your data here' 
WHERE id = (SELECT nextval('capped_collection_id_seq')) 

nextval आदेश हमें अगले आईडी हो जाता है की तरह एक अद्यतन करते हैं, और क्योंकि हम CYCLE निर्दिष्ट यह एक बार यह MAXVALUE तक पहुंचने के बाद लगभग 1 तक लपेट जाएगा। अंतिम परिणाम यह है कि आपके पास तालिका में केवल MAXVALUE पंक्तियां होंगी, जिसमें सबसे पुरानी प्रविष्टियां वृद्ध हो रही हैं।

(http://www.rigelgroupllc.com/blog/2014/10/14/capped-collections-in-postgres/ से)

संबंधित मुद्दे