अद्यतन : अब संरचित डेटा पर एक डॉक्टर है । इसके अलावा, NoSQL डेटा संरचनाओं पर इस उत्कृष्ट पोस्ट को देखें ।
RDBMS के विपरीत, पदानुक्रमित डेटा के साथ मुख्य मुद्दा यह है कि यह घोंसले के डेटा को लुभा रहा है क्योंकि हम कर सकते हैं। आमतौर पर, आप बयानों और प्रश्नों की कमी के बावजूद डेटा को कुछ हद तक सामान्य करना चाहते हैं (जैसे आप SQL के साथ करेंगे)।
आप उन जगहों पर भी वंचित करना चाहते हैं जहां पढ़ने की क्षमता एक चिंता का विषय है। यह सभी बड़े पैमाने पर एप्लिकेशन (जैसे ट्विटर और फेसबुक) द्वारा उपयोग की जाने वाली तकनीक है और यद्यपि यह हमारे DRY सिद्धांतों के खिलाफ जाती है, यह आमतौर पर स्केलेबल ऐप्स की एक आवश्यक विशेषता है।
यहाँ सार यह है कि आप पठन को आसान बनाने के लिए लिखने के लिए कड़ी मेहनत करना चाहते हैं। तार्किक घटकों को अलग-अलग पढ़ा जाता है (जैसे कि चैट रूम के लिए, संदेशों को न रखें, कमरों के बारे में मेटा जानकारी और सभी सदस्यों की सूची एक ही स्थान पर, यदि आप बाद में समूहों को पुन: व्यवस्थित करना चाहते हैं)।
Firebase के वास्तविक समय डेटा और SQL वातावरण के बीच प्राथमिक अंतर डेटा क्वेरी कर रहा है। डेटा के वास्तविक समय की प्रकृति के कारण "इसका चयन करने के लिए कोई सरल तरीका नहीं है, जहां एक्स = वाई" है (यह लगातार बदलते, तेज, सामंजस्य, आदि है, जिसके कारण सिंक्रनाइज़ किए गए क्लाइंट को जांच में रखने के लिए एक सरल आंतरिक मॉडल की आवश्यकता होती है)
एक सरल उदाहरण शायद आपको मन की सही स्थिति में स्थापित कर देगा, इसलिए यहां दिया गया है:
/users/uid
/users/uid/email
/users/uid/messages
/users/uid/widgets
अब, चूंकि हम एक पदानुक्रमित संरचना में हैं, अगर मैं उपयोगकर्ताओं के ईमेल पते को पुन: क्रमबद्ध करना चाहता हूं, तो मैं कुछ इस तरह करता हूं:
// I could also use on('child_added') here to great success
// but this is simpler for an example
firebaseRef.child('users').once('value')
.then(userPathSnapshot => {
userPathSnapshot.forEach(
userSnap => console.log('email', userSnap.val().email)
);
})
.catch(e => console.error(e));
इस दृष्टिकोण के साथ समस्या यह है कि मैंने ग्राहक को केवल सभी उपयोगकर्ताओं को डाउनलोड करने के लिए मजबूर किया है messages
और widgets
भी। कोई बड़ी बात नहीं अगर उन चीजों में से कोई हजारों की संख्या में। लेकिन 10k उपयोगकर्ताओं के लिए एक बड़ा सौदा प्रत्येक 5k संदेशों के ऊपर की ओर है।
तो अब एक पदानुक्रमित, वास्तविक समय संरचना के लिए इष्टतम रणनीति अधिक स्पष्ट हो जाती है:
/user_meta/uid/email
/messages/uid/...
/widgets/uid/...
एक अतिरिक्त उपकरण जो इस वातावरण में अत्यंत उपयोगी है, सूचक हैं। कुछ विशेषताओं वाले उपयोगकर्ताओं का एक इंडेक्स बनाकर, मैं केवल एसक्यूएल क्वेरी को केवल इंडेक्स को पुनरावृत्त करके अनुकरण कर सकता हूं:
/users_with_gmail_accounts/uid/email
अब अगर मुझे gmail उपयोगकर्ताओं के लिए संदेश प्राप्त करना, कहना, मैं कुछ इस तरह से कर सकता हूं:
var ref = firebase.database().ref('users_with_gmail_accounts');
ref.once('value').then(idx_snap => {
idx_snap.forEach(idx_entry => {
let msg = idx_entry.name() + ' has a new message!';
firebase.database().ref('messages').child(idx_entry.name())
.on(
'child_added',
ss => console.log(msg, ss.key);
);
});
})
.catch(e => console.error(e));
मैंने डेटा को निरूपित करने के बारे में एक और एसओ पोस्ट में कुछ विवरण पेश किए, इसलिए उन लोगों की भी जांच करें । मुझे लगता है कि फ्रैंक ने अनंत के लेख को पहले ही पोस्ट कर दिया है, इसलिए मैं इसे यहां नहीं दोहराऊंगा, लेकिन यह भी एक महान पढ़ा है।