मेरे पास बहुत से (उदा।) पोस्ट हैं, जो एक या अधिक टैग के साथ चिह्नित हैं। पोस्ट बनाया या हटाया जा सकता है, और उपयोगकर्ता एक या अधिक टैग (तार्किक और संयुक्त के साथ संयुक्त) के लिए खोज अनुरोध कर सकता है। पहले विचार है कि मेरे मन में आए एक साधारण मॉडल बनाने और हटाने के संचालन के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/सेकंड संशोधित कर सकता है, इसलिए अक्सर उपयोग करने योग्य टैग के लिए हमारे पास विलंबता के साथ एक बाधा भी होती है।
कोई सुझाव?
अंतराल पदों को जोड़ने के लिए एक पत्रिका को लागू करने से हल किया जा सकता। जब पोस्ट जोड़ने के लिए कतारबद्ध किया जाता है - यह एक विशेष ऑब्जेक्ट बनाता है जैसे कि "देखो! वह पोस्ट उस टैग से संबंधित है" प्रत्येक टैग के लिए (और टैग इकाइयों की memcache प्रति को भी संशोधित करता है), अगर memcache प्रति समाप्त हो गया है, तो जर्नल एप्पल सभी जर्नल प्रविष्टियों को एकत्र करता है और डेटास्टोर में टैग इकाई को लागू करता है (और इसे memcache में भी कॉपी करता है)। –