22

के साथ कार्य करना हाल ही में मैं Firebase से Firestore करने के लिए अपने डेटा मॉडल ले जाया गया। मेरा पूरा कोड काम कर रहा है, लेकिन मुझे कुछ डेटा पुनर्प्राप्त करने के लिए मेरे घोंसले हुए प्रश्नों के बारे में कुछ बदसूरत परेशानी हो रही है।Firestore: नेस्टेड एकल प्रश्नों

अभी इस हिस्से के लिए अपने डेटा मॉडल इस तरह दिखता है (हाँ एक और अनुयायियों/उदाहरण फ़ीड!):

{ 
    "Users": { //Collection 
    "UserId1" : { //Document 
     "Feed" : { //Subcollection of Id of posts from users this user Follow 
     "PostId1" : { //Document 
      "timeStamp" : "SomeDate" 
     }, 
     "PostId2" : { 
      "timeStamp" : "SomeDate" 
     }, 
     "PostId3" : { 
      "timeStamp" : "SomeDate" 
     } 
     } 
     //Some data 
    } 
    }, 
    "Posts":{ //Collection 
    "PostId1":{ //Document 
     "Comments" :{ //Subcollection 
     "commentId" : { //Document 
      "authorId": "UserId1" 
      //comentsData 
     } 
     }, 
     "Likes" : { //Subcollection 
     "UserId1" : { //Document 
      "liked" : true 
     }  
     } 
    } 
    } 
} 

ठीक है, मेरी समस्या अभी उस के लिए की पोस्ट को पुनः प्राप्त है यहाँ है एक उपयोगकर्ता की फ़ीड मैं अगले रास्ते में क्वेरी करना चाहिए:

  • मेरे फ़ीड से टाइमस्टैम्प द्वारा पिछले एक्स दस्तावेजों orderer जाओ

feedCol(userId).orderBy(CREATION_DATE, Query.Direction.DESCENDING).limit(limit)

  • उसके बाद मैं सूची से लिया गया प्रत्येक पोस्ट के किसी एक क्वेरी करना चाहिए: workoutPostCol.document(postId)

  • अब मैं प्रत्येक पोस्ट के आंकड़े उपलब्ध नहीं हैं, लेकिन मैं उपयोगकर्ता नाम, चित्र, अंक गोली मार दी चाहता हूँ। । लेखक, जो एक अलग Document में है, इसलिए, फिर से मैं हर authorId पदों userSocial(userId).document(toId)

  • अंत में, और नहीं कम महत्वपूर्ण की सूची में लिया गया के लिए एक और एक क्वेरी करना चाहिए के आदि, मैं अगर पता करने की जरूरत मेरी वर्तमान उपयोगकर्ता पहले से ही उस पोस्ट को पसंद आया है, इसलिए मैं प्रत्येक पोस्ट (फिर) के लिए किसी एक क्वेरी करते हैं और जांच करने की जरूरत है, तो मेरी userId के अंदर है posts/likes/{userId}

अभी सब कुछ काम कर रहा है, लेकिन सोच है कि Firestore की कीमत डेटाबेस कॉल की संख्या के आधार पर किया जाता है , और यह भी कि यह मेरे प्रश्नों को और अधिक सरल नहीं बनाता है, मुझे नहीं पता कि यह मेरा डेटा मॉडल इस तरह के डेटाबेस के लिए अच्छा नहीं है और मुझे सामान्य SQL या फिर Firebase पर वापस जाना चाहिए।

नोट: मुझे पता है कि सब कुछ, एक बहुत अधिक आसान मेरे उपयोगकर्ता या पोस्ट दस्तावेजों के अंदर arraylists को पसंद, चारा, आदि के इस subcollections चलती होगा, लेकिन एक दस्तावेज़ की सीमा है 1 एमबी और इस करता है, तो ज्यादा बढ़ोतरी, यह भविष्य में दुर्घटनाग्रस्त हो जाएगा। दूसरी तरफ Firestore एकाधिक whereEqualTo का उपयोग करते हुए उप-दस्तावेज़ क्वेरी (अभी तक) या OR खंड की अनुमति नहीं देता है।

मैं जो अपने Collections में joins और queries बनाने के लिए ID's संबंध इस तरह का स्टोर करने के लिए, Arraylists का उपयोग भयानक होगा एक आसान तरीका की तलाश में समस्या है उपयोगकर्ताओं द्वारा पोस्ट की एक बहुत कुछ पढ़ा है, लेकिन 1 एमबी की सीमा सीमित बहुत ज्यादा।

आशा है कि किसी को मेरे मन को स्पष्ट, या कम से कम मुझे कुछ नया सिखाने के लिए सक्षम हो जाएगा, शायद अपने मॉडल सिर्फ बकवास है और वहाँ यह करने के लिए एक सरल और आसान तरीका है। या हो सकता है कि मेरा मॉडल गैर-एसक्यूएल डेटाबेस के लिए संभव नहीं है।

सब कुछ के लिए धन्यवाद, आपका दिन शुभ हो।

उत्तर

7

यह 100% सुनिश्चित नहीं है कि यह पूरी तरह से समस्या हल करता है, क्योंकि आपके उपयोग के लिए किनारे के मामले हो सकते हैं।लेकिन 5 मिनट की त्वरित सोच के साथ, मुझे लगता है कि निम्नलिखित आपकी समस्या का समाधान कर सकते हैं:

आप Instagram के समान मॉडल का उपयोग करने पर विचार कर सकते हैं। अगर मेरी याददाश्त अच्छी तरह से मेरी सेवा करती है, तो वे events-आधारित संग्रह है। इस विशिष्ट संदर्भ में events द्वारा मेरा मतलब है कि उपयोगकर्ता द्वारा किए गए सभी कार्यों का मतलब है। तो comment एक घटना है, like एक ईवेंट इत्यादि है।

इससे ऐसा होगा ताकि आपको कुल में तीन मुख्य संग्रह की आवश्यकता पड़े।

users 
-- userID1 
---- userdata (profile pic, bio etc.) 
---- postsByUser : [postID1, postID2] 
---- followedBy : [userID2, ... ] 
---- following : [userID2, ... ] 
-- userID2 
---- userdata (profile pic, bio etc.) 


posts 
-- postID1 (timestamp, so it's sortable) 
---- contents 
---- author : userID1 
---- authorPic : authorPicUrl 
---- authorPoints : 12345 
---- taggedUsers : [] 
---- comments 
------ comment1 : { copy of comment event } 
---- likes : [userID1, userID2] 
-- postID2 (timestamp) 
---- contents 
... 


events 
-- eventID1 
---- type : comment 
---- timestamp 
---- byWhom : userID 
---- toWhichPost : postID 
---- contents : comment-text 
-- eventID2 
---- type : like 
---- timestamp 
---- byWhom : userID 
---- toWhichPost : postID 

अपने उपयोगकर्ता के जैव पेज के लिए, आप users क्वेरी होगा।

खबर के लिए फ़ीड आप userIDs के सभी पोस्ट अपने उपयोगकर्ता पिछले 1 दिन में पीछा कर रहा है (या किसी भी समयावधि) के लिए posts,

गतिविधि फ़ीड पेज के लिए क्वेरी होगा (टिप्पणी/पसंद करती है आदि) आप (या अगर वहाँ उन दिनों में कोई नई गतिविधि है)

events कि (या किसी भी समयावधि) अपने userID पिछले 1 दिन तक ही सीमित करने के लिए प्रासंगिक

अंत में पदों/उपयोगकर्ता स्क्रॉल के रूप में की घटनाओं के लिए अगले कुछ दिनों क्वेरी हैं क्वेरी होगा

फिर, यह केवल एक त्वरित विचार है, मैं एसओएफ हे के बुजुर्गों को जानता हूं crucifying इन आमतौर पर है, इसलिए मुझे SOF के साथी सदस्यों को माफ करता है, तो क्या यह उत्तर खामियों :)

आशा है कि यह मदद करता है फ्रांसिस्को है की आदत,

गुड लक ve!

+0

मुझे 'घटनाओं' भाग पसंद है, मैंने ऐसा कुछ भी सोचा था कि अधिसूचनाएं केवल एक बार भेजी जाती हैं। दूसरी तरफ, मैंने पहले ही देखा है कि मुझे अपने डेटा को और अधिक असामान्य करना चाहिए (केवल आईडी के बजाय उपयोगकर्ता नाम और फोटो यूआरएल सहेजें), कोई उपयोगकर्ता अपना नाम या चित्र अक्सर नहीं बदलेगा, और अंत में अनंत नेस्टेड प्रश्नों को जोड़ने से अधिक कठोर होगा पोस्ट, टिप्पणियां, पसंद ... आदि –

+0

अंततः मुझे लगता है कि 'फीड' के लिए मुझे प्रत्येक उपयोगकर्ता के पदों के संदर्भों की एक सूची में रहना चाहिए, अंत में कारण, केवल एक बार कॉपी करें या हटाएं एक बार जब सभी आईडी प्रत्येक उपयोगकर्ता के सभी अंतिम पदों को पुनर्प्राप्त करने के लिए बड़ी क्वेरी बनाने से अधिक आसान हो जाएंगे, तो मैं हर बार जब मैं अपनी फ़ीड जांचना चाहता हूं तो मैं अनुवर्ती हूं। –

+1

@ फ्रांसिस्को डर्डिन गार्सिया - कारण मैंने इंस्टाग्राम के एपीआई का सुझाव दिया क्योंकि मेरा मानना ​​है कि वे इसे 'ईवेंट' विधि का उपयोग कर प्रकाश रखने में भी कामयाब रहे हैं। आपके द्वारा अनुसरण किए जाने वाले उपयोगकर्ताओं द्वारा सभी पोस्ट की सूची रखने के संबंध में, यह एक फिसलन ढलान है, क्योंकि इसके लिए एक व्यस्त डेटा मॉडल की आवश्यकता होती है। मान लें कि आप मेरा पीछा कर रहे हैं, और मैं एक पोस्ट करता हूं। इसके लिए मुझे आपके उपयोगकर्ता को डेटा का एक टुकड़ा लिखना आवश्यक है। सुरक्षा को अधिक जटिल बनाने के अलावा, पैमाने पर, इस समाधान के लिए मेरे उपयोगकर्ता को 200k अन्य उपयोगकर्ताओं के प्रोफाइल में 1 पोस्ट लिखने की आवश्यकता होगी यदि मेरे पास 200k अनुयायियों हैं। मैं उस अनुमान को आपके अनुमानित पैमाने के आधार पर चुनूंगा। – johnozbay

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