उपयोगकर्ताओं के लिए पोस्ट दिखाने जैसे ट्विटर के लिए एपेंगेन डेटास्टोर मॉडल - पायथन, google-app-engine, google-cloud-datastore, डेटास्टोर, nosql

मैं एक वेब सिस्टम पर काम कर रहा हूं जहां एक सुविधा उपयोगकर्ताओं की सूची का पालन करने और सूची के रूप में अपनी पोस्ट देखने की ट्विटर की अवधारणा के समान है।

मेरे साथ आया सरल मॉडल की आवश्यकता है join ऑपरेशन जो उपलब्ध नहीं है datastore

class Post(Model):
author = reference to user id
content = text content

class Following(Model):
author = reference to user id
followed_by = reference to user id

लगातार ऑपरेशन मौजूदा उपयोगकर्ताओं के बाद उपयोगकर्ताओं की पोस्ट (समय में क्रमबद्ध) की एक सूची प्रदर्शित करना है।

उपर्युक्त मॉडल के साथ, यह केवल दो चरणों में किया जा सकता है:

authors = Following.author when Following.followed_by == current_user
posts = Posts with Posts.author in authors

क्या यह और अधिक कुशलता से हासिल करने का कोई तरीका है?

उत्तर:

जवाब के लिए 0 № 1

आप एक का उपयोग कर सकते हैं संरचना संपत्ति लेखक ऑब्जेक्ट के भीतर सभी पोस्ट स्टोर करने के लिए।

वहाँ एक है दिलचस्प चर्चा यहां आपके लिए यह चुनना दिलचस्प हो सकता है कि आपके उपयोग के मामले में कौन सा दृष्टिकोण सबसे अच्छा है।


जवाब के लिए 0 № 2

यदि आप एल्गोरिदम को थोड़ा बदलते हैं तो आप पोस्ट प्रदर्शित करने के लिए एक ही क्वेरी का उपयोग कर सकते हैं। आप ट्रैक कर सकते हैं कि किसी विशेष उपयोगकर्ता के लिए कौन सी पोस्ट प्रदर्शित करने की आवश्यकता होगी, इन संस्थाओं के साथ:

class DisplayPost(Model):
#parent entity = user for which the post should be displayed
#key ID matches the Post"s key ID
posted = datetime  # if you want timed ordering in display
expiry = datetime  # optional for periodic cleanup jobs

जब भी कोई लेखक एक नई पोस्ट बनाता है तो आप लेखक के प्रत्येक अनुयायी के लिए ऐसी संस्थाएं बनाने के लिए केवल लॉन्च कार्य (ओं) करते हैं।

जब भी आपको किसी उपयोगकर्ता के लिए पोस्ट प्रदर्शित करने की आवश्यकता होती है तो आप "एक पूर्व पूर्वज बनाते हैं keys_only सूची पाने के लिए पूछताछ DisplayPost चांबियाँ:

keys = DisplayPost.query(ancestor=user_key, ...).fetch(keys_only=True)

इससे आप की एक संबंधित सूची प्राप्त होती है Post कुंजी और एक के साथ पोस्ट प्राप्त करें get_multi() ओप, इन लाइनों के साथ कुछ:

post_keys = [ndb.Key(Post, key.id()) for key in keys]
posts = ndb.get_multi(post_keys)

पदों को प्रदर्शित करते समय, आपको बिना किसी त्वरित प्रतिक्रिया समय की अनुमति मिलती है join और नहीं IN (भी समस्याग्रस्त) ऑप्स। बेहतर स्केलेबिलिटी। भुगतान करने की कीमत हमेशा तैयार होती है DisplayPost, भले ही उनमें से कुछ का कभी भी उपयोग नहीं किया जाएगा (यदि संबंधित उपयोगकर्ता उदाहरण के लिए लॉग इन नहीं करते हैं)।


संबंधित सवाल
सबसे लोकप्रिय