इस गाइड में, डेटा आर्किटेक्चर से जुड़े कुछ अहम सिद्धांतों के साथ-साथ, सबसे बेहतर आपके Firebase Realtime Database में JSON डेटा को स्ट्रक्चर करने के तरीके.
एक सही तरीके से स्ट्रक्चर किया गया डेटाबेस बनाने के लिए, काफ़ी पहले से सोच-विचार करने की ज़रूरत होती है. सबसे ज़रूरी बात, आपको यह प्लान करना होगा कि डेटा कैसे सेव किया जाएगा और ताकि उस प्रक्रिया को जितना हो सके उतना आसान बनाया जा सके.
डेटा को कैसे स्ट्रक्चर किया गया है: यह एक JSON ट्री है
Firebase Realtime Database का पूरा डेटा, JSON ऑब्जेक्ट के तौर पर सेव किया जाता है. आप सोच सकते हैं कि
डेटाबेस को क्लाउड पर होस्ट किए गए JSON ट्री के तौर पर सेव करता है. एसक्यूएल डेटाबेस के मुकाबले, इसमें टेबल या रिकॉर्ड नहीं होते. JSON ट्री में डेटा जोड़ने पर, यह
मौजूदा JSON स्ट्रक्चर को ऐक्सेस करने के लिए किया जा सकता है. आपके पास अपनी कुंजियां उपलब्ध कराने का विकल्प होता है. जैसे, यूज़र आईडी या सेमैंटिक नाम. इसके अलावा, push()
तरीके का इस्तेमाल करके, आपके लिए कुंजियां उपलब्ध कराई जा सकती हैं.
अगर आप अपनी खुद की कुंजियां बनाते हैं, तो वे UTF-8 में एन्कोड की गई होनी चाहिए. ये कुंजियां, ज़्यादा से ज़्यादा हो सकती हैं
का साइज़ 768 बाइट है और इसमें .
, $
, #
, [
, ]
, /
या ASCII कंट्रोल नहीं हो सकता
वर्ण 0-31 या 127. वैल्यू में ASCII कंट्रोल वर्ण इस्तेमाल नहीं किए जा सकते
खुद भी कर सकते हैं.
उदाहरण के लिए, ऐसे चैट ऐप्लिकेशन पर विचार करें जो उपयोगकर्ताओं को
प्रोफ़ाइल और संपर्क सूची. आम तौर पर, उपयोगकर्ता की प्रोफ़ाइल किसी पाथ पर होती है, जैसे कि
/users/$uid
. उपयोगकर्ता alovelace
के पास डेटाबेस में ऐसी एंट्री हो सकती है जो कुछ इस तरह दिखती है:
{ "users": { "alovelace": { "name": "Ada Lovelace", "contacts": { "ghopper": true }, }, "ghopper": { ... }, "eclarke": { ... } } }
हालांकि डेटाबेस, JSON ट्री का इस्तेमाल करता है, लेकिन डेटाबेस में सेव किया गया डेटा दिखाए गए कुछ खास तरह के नेटिव टाइप, जो उपलब्ध JSON टाइप से मेल खाते हैं ताकि आपको मैनेज किए जा सकने वाले कोड लिखने में मदद मिल सके.
डेटा स्ट्रक्चर के लिए सबसे सही तरीके
डेटा को नेस्ट करने से बचना
Firebase Realtime Database की मदद से, 32 लेवल तक डेटा नेस्ट किया जा सकता है. ऐसा हो सकता है कि आप चाहें, तो डिफ़ॉल्ट तौर पर इसे लागू किया जाए. हालांकि, जब अपने डेटाबेस में किसी जगह पर डेटा फ़ेच किया जाता है, तो आपको यह जानकारी भी मिल जाती है कि इसके सभी चाइल्ड नोड. साथ ही, जब किसी व्यक्ति को पढ़ने या लिखने का ऐक्सेस दिया जाता है आपके डेटाबेस के किसी नोड में होता है, तो आप उन्हें इसके तहत आने वाले सारे डेटा का ऐक्सेस भी देते हैं नोड के लिए अलग-अलग हैं. इसलिए, बेहतर होगा कि अपने डेटा स्ट्रक्चर को एक जैसा रखें किया जा सकता है.
नेस्ट किया गया डेटा खराब क्यों है, इसका उदाहरण देने के लिए, यहां दिए गए कई बार नेस्ट किए गए स्ट्रक्चर को देखें:
{ // This is a poorly nested data architecture, because iterating the children // of the "chats" node to get a list of conversation titles requires // potentially downloading hundreds of megabytes of messages "chats": { "one": { "title": "Historical Tech Pioneers", "messages": { "m1": { "sender": "ghopper", "message": "Relay malfunction found. Cause: moth." }, "m2": { ... }, // a very long list of messages } }, "two": { ... } } }
इस नेस्ट किए गए डिज़ाइन के साथ, डेटा के ज़रिए बार-बार काम करने में समस्या आ जाती है. इसके लिए
उदाहरण के लिए, चैट बातचीत के टाइटल की सूची बनाने के लिए, पूरे chats
की ज़रूरत होती है
ट्री, जिसमें सभी सदस्य और मैसेज शामिल हैं, को क्लाइंट पर डाउनलोड करना होगा.
डेटा स्ट्रक्चर को फ़्लैट करें
अगर डेटा को अलग-अलग पाथ में बांटा जाता है, जिसे डेनॉर्मलाइज़ेशन भी कहा जाता है, तो ज़रूरत के हिसाब से अलग-अलग कॉल में इसे आसानी से डाउनलोड किया जा सकता है. इन बातों पर ध्यान दें यह समतल संरचना है:
{ // Chats contains only meta info about each conversation // stored under the chats's unique ID "chats": { "one": { "title": "Historical Tech Pioneers", "lastMessage": "ghopper: Relay malfunction found. Cause: moth.", "timestamp": 1459361875666 }, "two": { ... }, "three": { ... } }, // Conversation members are easily accessible // and stored by chat conversation ID "members": { // we'll talk about indices like this below "one": { "ghopper": true, "alovelace": true, "eclarke": true }, "two": { ... }, "three": { ... } }, // Messages are separate from data we may want to iterate quickly // but still easily paginated and queried, and organized by chat // conversation ID "messages": { "one": { "m1": { "name": "eclarke", "message": "The relay seems to be malfunctioning.", "timestamp": 1459361875337 }, "m2": { ... }, "m3": { ... } }, "two": { ... }, "three": { ... } } }
अब चैट रूम की सूची में, सिर्फ़ हर बातचीत की कुछ बाइट, लिस्टिंग या डिसप्ले के लिए तेज़ी से मेटाडेटा फ़ेच किया जा रहा है यूज़र इंटरफ़ेस (यूआई) में रूम. मैसेज अलग से फ़ेच किए जा सकते हैं और उनके आने पर वे दिखते हैं, इसकी मदद से, यूज़र इंटरफ़ेस (यूआई) को रिस्पॉन्सिव और तेज़ बनाया जा सकता है.
ज़रूरत के हिसाब से डेटा बनाना
ऐप्लिकेशन बनाते समय, सूची का सबसेट डाउनलोड करना अक्सर बेहतर होता है. ऐसा खास तौर पर तब होता है, जब सूची में हज़ारों रिकॉर्ड हों. जब यह संबंध स्थिर और एकतरफ़ा हो, तो आप चाइल्ड ऑब्जेक्ट से मिलता-जुलता है.
कभी-कभी, यह संबंध ज़्यादा डाइनैमिक होता है या यह ज़रूरी हो सकता है कि इस डेटा को सामान्य न बनाना हो. कई बार, डेटा का सबसेट पाने के लिए क्वेरी का इस्तेमाल करके, डेटा को नॉर्मलाइज़ किया जा सकता है. इस बारे में डेटा पाना में बताया गया है.
हालांकि, यह भी हो सकता है कि यह काफ़ी न हो. उदाहरण के लिए, दो-तरफ़ा संबंध पर विचार करें उपयोगकर्ता और ग्रुप के बीच. उपयोगकर्ता किसी ग्रुप में शामिल हो सकते हैं और ग्रुप में उपयोगकर्ताओं की सूची. यह तय करना मुश्किल हो जाता है कि कोई उपयोगकर्ता किन ग्रुप से जुड़ा है.
हालांकि, सबसे ज़रूरी है कि आप उन ग्रुप की सूची बनाएं जिनसे कोई उपयोगकर्ता जुड़ा है और केवल उन समूहों का डेटा फ़ेच किया जाता है. ग्रुप का इंडेक्स यहां काफ़ी मददगार हो सकता है:
// An index to track Ada's memberships { "users": { "alovelace": { "name": "Ada Lovelace", // Index Ada's groups in her profile "groups": { // the value here doesn't matter, just that the key exists "techpioneers": true, "womentechmakers": true } }, ... }, "groups": { "techpioneers": { "name": "Historical Tech Pioneers", "members": { "alovelace": true, "ghopper": true, "eclarke": true } }, ... } }
आपको यह दिख सकता है कि यह संबंध को, Ada के रिकॉर्ड और ग्रुप, दोनों में सेव करके कुछ डेटा को डुप्लीकेट कर देता है. अब alovelace
को
और techpioneers
, Ada की प्रोफ़ाइल में मौजूद है. ऐडा को मिटाने के लिए
को ग्रुप से बाहर रखना है, तो इसे दो जगहों पर अपडेट करना होगा.
यह दो-तरफ़ा संबंधों के लिए एक ज़रूरी रिडंडंसी है. इससे आपको ये काम करने में मदद मिलती है की सदस्यता को तुरंत और आसानी से फ़ेच कर सकते हैं. ऐसा तब भी होगा, जब ग्रुप, लाखों में या Realtime Database के सुरक्षा नियमों को स्केल करते हैं कुछ रिकॉर्ड का ऐक्सेस रोका जाता है.
इस तरीके में, आईडी को कुंजियों के तौर पर लिस्ट करके और वैल्यू को 'सही' पर सेट करके, डेटा को उलट दिया जाता है. इससे, किसी कुंजी की जांच करना उतना ही आसान हो जाता है जितना कि /users/$uid/groups/$group_id
को पढ़ना और यह देखना कि वह null
है या नहीं. इंडेक्स ज़्यादा तेज़ है
और डेटा को क्वेरी या स्कैन करने की तुलना में ज़्यादा बेहतर तरीके से काम करते हैं.