2012-07-20 12 views
46

क्या फ़ायरबेस के साथ डेटाबेस-शैली क्वेरी करने का कोई तेज़ तरीका है?फ़ायरबेस के साथ डेटाबेस-शैली क्वेरीज़

उदाहरण के लिए

:

क्षेत्रों user_id, name के साथ एक firebase संदर्भ को देखते हुए users, और age, क्या एक प्रश्न इस के समान करने का सबसे अच्छा तरीका होगा:

SELECT name FROM users WHERE `user_id`=147; 

और

SELECT COUNT(*) FROM users WHERE age=21; 

उत्तर

70

सामान्य रूप से, नहीं। फायरबेस अनिवार्य रूप से एक "रीयलटाइम डेटाबेस" है, जो डेटा परिवर्तनों के रूप में आपके लिए अपडेट स्ट्रीमिंग करता है, इसलिए सामान्य उद्देश्य पूछताछ करना अधिक कठिन होता है। अभी के लिए, प्रदान किए गए प्राइमेटिव्स की कुछ (स्वीकार्य रूप से सीमित) पूछताछ की गई है। दस्तावेज़ों में Queries/Limits पृष्ठ देखें।

आप अक्सर दृष्टिकोण की एक किस्म के माध्यम से इन सीमाओं के आसपास काम कर सकते हैं:

  • स्थान का उपयोग करें नाम और प्राथमिकताओं समझदारी से। यदि आप अपने डेटा को/उपयोगकर्ता/[userid]/name के रूप में ढांचा बनाते हैं, तो आप केवल/उपयोगकर्ता/147/नाम पुनर्प्राप्त करके अपना पहला "क्वेरी" पूरा कर सकते हैं। यदि आप जानते हैं कि आप उम्र से पूछना चाहते हैं, तो आप आयु का उपयोग उपयोगकर्ता नोड्स के लिए प्राथमिकता के रूप में कर सकते हैं और फिर "usersRef.startAt (21) .endAt (21) .on ('child_added', ...)" सभी उपयोगकर्ताओं को उम्र 21 प्राप्त करें। आपको अभी भी उन्हें मैन्युअल रूप से गिनना होगा।
  • क्लाइंट-साइड पूछताछ करें। यदि पूरा डेटा सेट छोटा है, तो आप संपूर्ण डेटा सेट को पुनर्प्राप्त करने में सक्षम हो सकते हैं और फिर क्लाइंट पर इसे मैन्युअल रूप से फ़िल्टर/संसाधित कर सकते हैं।
  • एक अलग सर्वर चलाएं। यह फायरबेस से कनेक्ट हो सकता है, डेटा सिंक कर सकता है और फिर ग्राहकों के लिए "प्रश्न" का उत्तर दे सकता है। यह अभी भी फायरबेस के माध्यम से ग्राहकों को संवाद कर सकता है, और फायरबेस अभी भी प्राथमिक डेटा स्टोर हो सकता है, लेकिन आपका अलग सर्वर क्वेरी को जल्दी से करने के लिए काम कर सकता है।

हम समय के साथ इस पर सुधार करने के लिए, के रूप में हम महसूस करते हैं कि यह एक कमजोर पारंपरिक रिलेशनल डाटाबेस सिस्टम द्वारा प्रदान लचीला क्वेरी किए जाने की तुलना में है इरादा रखते हैं।

+1

माइकल के साथ यह फ़िल्टर किया, अपनी टीम क्वेरी किए जाने के साथ किसी भी नए घटनाक्रम बनाया है? –

+3

कोई उल्लेखनीय नई विशेषताएं नहीं। आपको इस ब्लॉग पोस्ट में दिलचस्पी हो सकती है, जिसे हमने हाल ही में बाहर रखा है, फ़ायरबेस के लिए अपने डेटा को संरचित करने के लिए सर्वोत्तम प्रथाओं का वर्णन करते हुए, यह देखते हुए कि हम एसक्यूएल जैसी क्वेरीिंग का समर्थन नहीं करते हैं: https://www.firebase.com/blog/2013- 04-12-denormalizing-is-normal.html –

+3

अब एक ब्लॉग पोस्ट और "एक अलग सर्वर के रूप में चलाएं" दृष्टिकोण के लिए एक नया lib है जो दिखाता है कि लोचदार खोज को एकीकृत करना कितना पागल आसान है: https: // www। firebase.com/blog/2014-01-02-queries-part-two.html – Kato

24

श्री लेहेनबॉयर निश्चित रूप से सभी चीजों का मालिक फायरबेस है, तो उसे सुनो। ;) हालांकि, यह विशेष विषय है कि मैं अब कुछ हफ्तों तक श्रम कर रहा हूं।

यहाँ, मेरे विचार से कुछ को बढ़ाने के लिए कर रहे हैं और "क्लाइंट-साइड क्वेरी" प्रतिक्रियाओं "एक अलग सर्वर भागो":

ElasticSearch (एक Node.js लिपि)

एक साथ

सर्वर पर node.js स्क्रिप्ट, आप ElasticSearch एकीकृत कर सकते हैं और एक घंटे के भीतर कुछ ठोस सामग्री खोज प्रदान कर सकते हैं। https://www.firebase.com/blog/2014-01-02-queries-part-two.html

संचित करने योग्य/सामान्य क्वेरीज़

ये एक सर्वर/क्रॉन प्रक्रिया है जो तालिका पढ़ता है और डेटा डुप्लिकेट द्वारा नियंत्रित किया जा सकता है: यहाँ एक ब्लॉग पोस्ट और एक lib यह और भी आसान बनाता है। उदाहरण के लिए, मान लें कि मैं पंजीकरण के दौरान किसी उपयोगकर्ता के लॉगिन नाम के लिए "अनुपलब्ध/उपलब्ध" दिखाना चाहता हूं, लेकिन कुछ जटिल कारणों से उपयोगकर्ता रिकॉर्ड को एक अलग अद्वितीय आईडी द्वारा संग्रहीत करना चाहता हूं।

मेरा क्रोन/सर्वर उपयोगकर्ता तालिका से सभी रिकॉर्ड्स पढ़ सकता है, फिर उन्हें उपयोगकर्ता की रिकॉर्ड आईडी (या कोई अन्य डेटा जो मैं जानना चाहता हूं) के मूल्य के साथ ईमेल पते द्वारा संग्रहीत किसी अन्य तालिका में डाल सकता हूं। ।

यह डुप्लिकेट डेटा दृष्टिकोण मैनुअल कैशिंग तकनीक को सॉर्ट करता है और नो-एसक्यूएल वातावरण में एक सामान्य प्रथा है; हम गति और सरलीकृत प्रक्रियाओं के लिए भंडारण स्थान (जिसे सस्ता और उपलब्ध माना जाता है) का व्यापार कर रहे हैं।

अनुकूलित प्रश्नों (एक कतार का उपयोग कर)

कस्टम प्रश्नों एक्सएचआर (AJAX) सीधे एक सर्वर है, जो कठिन परिश्रम करते हैं और बेहतर परिणाम लौट सकते हैं करने के लिए के माध्यम से भेजा जा सकता है। वैकल्पिक रूप से, आप कतार का उपयोग करके सर्वर बैक-एंड से कनेक्ट करने के लिए फ़ायरबेस का उपयोग कर सकते हैं।

ग्राहक क्वेरी अनुरोध को JS12 के रूप में queue नामक एक विशेष फायरबेस तालिका में रखता है और प्रतिक्रिया का इंतजार करता है।

सर्वर queue.on('child_added', ...) के लिए सुनता है और डेटा वापस `queue_record.child का उपयोग कर कार्य करता है (यहाँ, 'प्रतिक्रिया' ... डेटा ...)

यह कुछ अच्छा फायदे हैं। एक के लिए, किसी भी संख्या में सर्वर सुन सकते हैं और प्रतिक्रियाओं को पूरा कर सकते हैं, जिससे हवा को संतुलित संतुलन बना दिया जाता है। इसके लिए कोड एसओ में स्थापित करने के लिए बहुत आसान है और covered in another thread है।

आशा है कि यह सहायक होगा!

+1

लोचदार खोज को एकीकृत करने के लिए अब भी एक lib है, जो पागल आसान है और पाई के रूप में खोजों को आसान बनाता है, node.js स्क्रिप्ट की लागत पर : https://www.firebase.com/blog/2014-01-02-queries-part-two.html – Kato

2

मैं firebase के लिए अपने खुद के सीएमएस बनाया था, इसलिए जब firebase डेटा की एक तालिका बनाने मैं इस

var child = ref.child(); 
var compare; 
switch(filter){ 
      case "First_Name": 
      compare = child.First_Name; 
      break; 
      case "Last_Name": 
      compare = child.Last_Name; 
      break; 
      case "Phone_Number": 
      compare = child.Phone_Number; 
      break; 
      case "Department_Number": 
      compare = child.Department_Number; 
      break; 
      case "Position": 
      compare = child.Position; 
      break; 
      case "Status": 
      compare = child.Status; 
      break; 
      case "Tier": 
      compare = child.Tier; 
      break; 
     } 


     if(compare.match("^" + string)){ 
     //display items 
+0

लीनबॉयर का अर्थ है "क्लाइंट-साइड पूछताछ"। और मैं इस समकक्ष का उपयोग करने की सलाह दूंगा लेकिन अधिक पठनीय रूप: 'अगर (बच्चा [फ़िल्टर]। मैच ('^'+ स्ट्रिंग)) {'(दूसरी पंक्ति से सबकुछ बदल देता है) – Jonathan

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