2010-11-25 8 views
5

मेरे पास बहुत से (उदा।) पोस्ट हैं, जो एक या अधिक टैग के साथ चिह्नित हैं। पोस्ट बनाया या हटाया जा सकता है, और उपयोगकर्ता एक या अधिक टैग (तार्किक और संयुक्त के साथ संयुक्त) के लिए खोज अनुरोध कर सकता है। पहले विचार है कि मेरे मन में आए एक साधारण मॉडल बनाने और हटाने के संचालन केGoogle ऐप इंजन (पायथन) पर अत्यधिक स्केलेबल टैग

class Post(db.Model): 
    #blahblah 
    tags = db.StringListProperty() 

कार्यान्वयन था स्पष्ट है। खोज अधिक जटिल है। एन टैग्स को खोजने के लिए यह एन जीक्यूएल प्रश्नों को "चयन * टैग से टैग करें: = 1" और कर्सर का उपयोग करके परिणामों को मर्ज करेगा, और इसमें भयानक प्रदर्शन होगा।

दूसरा विचार अलग करने के लिए विभिन्न संस्थाओं

class Post(db.Model): 
    #blahblah 
    tags = db.ListProperty(db.Key) # For fast access 

class Tag(db.Model): 
    name = db.StringProperty(name="key") 
    posts = db.ListProperty(db.Key) # List of posts that marked with tag 

यह कुंजी (बहुत तेजी से GQL से इसे ले) और स्मृति में विलय, मुझे लगता है कि इस कार्यान्वयन में बेहतर प्रदर्शन किया है द्वारा डाटाबेस से टैग लेता में टैग है पहले की तुलना में, लेकिन अक्सर उपयोग करने योग्य टैग अधिकतम आकार से अधिक हो सकते हैं जो सिंगल डेटास्टोर ऑब्जेक्ट के लिए अनुमति देता है। और एक और समस्या है: डेटास्टोर केवल एक ही ऑब्जेक्ट को ~ 1/सेकंड संशोधित कर सकता है, इसलिए अक्सर उपयोग करने योग्य टैग के लिए हमारे पास विलंबता के साथ एक बाधा भी होती है।

कोई सुझाव?

उत्तर

0

शायद एक संभव समाधान अपने दूसरे उदाहरण लेते हैं, और एक तरीका है कि अपेक्षाकृत बड़े समूहों पर कुशल प्रश्नों की अनुमति होगी उसे बदलने की है। एक तरीका है कि स्प्रिंग्स को दिमाग में एक ही टैग के लिए एकाधिक डेटाबेस इकाइयों का उपयोग करना है, और उन्हें इस तरह से समूहित करना है क्योंकि आपको शायद ही कभी कुछ समूहों से अधिक प्राप्त करने की आवश्यकता होगी। यदि डिफ़ॉल्ट सॉर्ट ऑर्डर (अच्छी तरह से इसे केवल एकमात्र अनुमति देता है) पोस्ट-डेट द्वारा है, तो उस क्रम में टैग समूह इकाइयों को भरें।

class Tag(db.Model): 
    name = db.StringProperty(name="key") 
    posts = db.ListProperty(db.Key) # List of posts that marked with tag 
    firstpost = db.DateTimeProperty() 

जोड़ते या एक समूह के लिए टैग को हटाने, कितने पदों कि समूह में हैं, अगर पोस्ट आप पोस्ट होगा जोड़ रहे हैं की तुलना में अधिक है देखने के लिए जाँच, 100 पदों का कहना है कि, दो टैग में इसे विभाजित समूहों। यदि आप एक पोस्ट को हटा रहे हैं ताकि समूह में 50 से कम पद हों, पिछले या अगले समूह से कुछ पोस्ट चुराएं। अगर आसन्न समूहों में से एक में 50 पद भी हैं, तो बस उन्हें एक साथ मिलाएं। टैग (पोस्ट-डेट ऑर्डर में) द्वारा पोस्ट सूचीबद्ध करते समय, आपको केवल कुछ मुट्ठी भर समूह की आवश्यकता होती है।

यह वास्तव में उच्च मांग वाली टैग समस्या का समाधान नहीं करता है।

इसके बारे में सोचकर, आवेषण थोड़ा अधिक सट्टा होने के लिए ठीक हो सकता है। नवीनतम टैग समूह प्रविष्टियां प्राप्त करें, उन्हें मर्ज करें और एक नया टैग समूह रखें। लेनदेन में अंतराल वास्तव में एक वास्तविक समस्या नहीं हो सकता है।

+1

अंतराल पदों को जोड़ने के लिए एक पत्रिका को लागू करने से हल किया जा सकता। जब पोस्ट जोड़ने के लिए कतारबद्ध किया जाता है - यह एक विशेष ऑब्जेक्ट बनाता है जैसे कि "देखो! वह पोस्ट उस टैग से संबंधित है" प्रत्येक टैग के लिए (और टैग इकाइयों की memcache प्रति को भी संशोधित करता है), अगर memcache प्रति समाप्त हो गया है, तो जर्नल एप्पल सभी जर्नल प्रविष्टियों को एकत्र करता है और डेटास्टोर में टैग इकाई को लागू करता है (और इसे memcache में भी कॉपी करता है)। –

1

निक की पूछताछ के आगे। यदि यह एक तार्किक है और वे क्वेरी में एकाधिक टैग का उपयोग कर रहे हैं। टैग = टैग 1 और टैग = टैग 2 का उपयोग करें ... एक ही क्वेरी में सदस्यता सेट करें डेटास्टोर की चमकदार सुविधाओं में से एक है। आप एक परिणाम में अपना परिणाम प्राप्त कर सकते हैं। लेन-देन में

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Properties_With_Multiple_Values

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