ফায়ারবেসে ডেটা গঠনের সর্বোত্তম উপায় কী?


111

আমি ফায়ারবেসে নতুন এবং আমি এটিতে ডেটা গঠনের সর্বোত্তম উপায় কী তা জানতে চাই।

আমার একটি সহজ উদাহরণ রয়েছে:

আমার প্রকল্পে আবেদনকারী এবং অ্যাপ্লিকেশন রয়েছে। ১ জন আবেদনকারীর বেশ কয়েকটি আবেদন থাকতে পারে। আমি কীভাবে এই 2 অবজেক্টগুলিকে ফায়ারবেসের সাথে সম্পর্কিত করতে পারি? এটি কি রিলেশনাল ডাটাবেসের মতো কাজ করে? অথবা ডেটা ডিজাইনের ক্ষেত্রে পদ্ধতির সম্পূর্ণ আলাদা হওয়া দরকার?

উত্তর:


137

আপডেট : ডেটা কাঠামোর বিষয়ে এখন একটি ডক রয়েছে । এছাড়াও, নোএসকিউএল ডেটা স্ট্রাকচারে এই দুর্দান্ত পোস্টটি দেখুন ।

আরডিবিএমএসের বিপরীতে, শ্রেণিবিন্যাস সম্পর্কিত ডেটা সহ প্রধান সমস্যাটি হ'ল এটি নীড়ের ডেটাগুলিকে লোভনীয় কারণ আমরা পারছি। সাধারণভাবে, আপনি যোগদানের বিবৃতি এবং প্রশ্নগুলির অভাব সত্ত্বেও কিছুটা পরিমাণে (যেমন আপনি এসকিউএল দিয়ে যাবেন) ডেটা স্বাভাবিক করতে চান।

আপনি যে জায়গাগুলিতে পড়ার দক্ষতা একটি উদ্বেগের বিষয়গুলিও অস্বীকার করতে চান । এটি একটি বৃহত স্কেল অ্যাপ্লিকেশন (যেমন টুইটার এবং ফেসবুক) দ্বারা ব্যবহৃত একটি কৌশল এবং যদিও এটি আমাদের DRY নীতিগুলির বিরুদ্ধে যায় তবে এটি সাধারণত স্কেবলযোগ্য অ্যাপসের একটি প্রয়োজনীয় বৈশিষ্ট্য।

এখানে সংক্ষিপ্তসারটি হ'ল পাঠকে সহজ করার জন্য আপনি লেখায় কঠোর পরিশ্রম করতে চান। যৌক্তিক উপাদানগুলি পৃথক পৃথকভাবে পড়ুন (যেমন চ্যাট রুমগুলির জন্য, বার্তাগুলি রাখবেন না, কক্ষগুলি সম্পর্কে মেটা তথ্য এবং সমস্ত সদস্যদের তালিকাগুলি একই জায়গায় রাখুন, যদি আপনি পরে দলগুলির পুনরাবৃত্তি করতে সক্ষম হন)

ফায়ারবেসের রিয়েল-টাইম ডেটা এবং একটি এসকিউএল পরিবেশের মধ্যে প্রাথমিক পার্থক্যটি ডেটা অনুসন্ধান করা। "সিলেক্ট ইউজারদের যেখানেই X = ওয়াই" বলার সহজ উপায় নেই, কারণ তথ্যগুলির আসল সময়ের প্রকৃতির (এটি ক্রমাগত পরিবর্তন করা, শারডিং করা, পুনর্মিলন করা ইত্যাদি ইত্যাদির জন্য সিঙ্ক্রোনাইজ ক্লায়েন্টদের তালিকায় রাখার জন্য একটি সহজ অভ্যন্তরীণ মডেল প্রয়োজন)

একটি সাধারণ উদাহরণ সম্ভবত আপনাকে মনের সঠিক অবস্থানে স্থাপন করবে, সুতরাং এখানে যায়:

/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

এখন যদি আমি জিমেইল ব্যবহারকারীদের জন্য বার্তা পেতে চাই, বলি, আমি এরকম কিছু করতে পারি:

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));

আমি ড্যানারমালাইজিং ডেটা সম্পর্কে অন্য এসও পোস্টে কিছু বিশদ প্রস্তাব দিয়েছিলাম, সুতরাং সেগুলিও পরীক্ষা করে দেখুন । আমি দেখতে পাচ্ছি যে ফ্রাঙ্ক ইতিমধ্যে অনন্তের নিবন্ধটি পোস্ট করেছে, তাই আমি এখানে এটির পুনরাবৃত্তি করব না, তবে এটি একটি দুর্দান্ত পঠন।


এই অন্তর্দৃষ্টি কাতোর জন্য ধন্যবাদ!
হুপার

2
আপাতত. ফায়ারবেস এর ভি 2 রিলিজের ভিউগুলিতে সেই প্রক্রিয়াটি স্বয়ংক্রিয় করার জন্য কিছু দুর্দান্ত ক্ষমতা থাকবে।
কাটো

সচেতন যে আমি এখানে একটি পুরানো মন্তব্য থ্রেডটি পুনরুত্থিত করছি, তবে আমি আরও একটি আপ-টু-ডেট সমাধান খুঁজতে লড়াই করছি। এটি কি এখনও সেরা পদ্ধতির? অর্থাত্ সমস্ত ব্যবহারকারীর_ই_গেইমেল_এক অ্যাকাউন্টস এবং তারপরে প্রতিটি জন্য চলছে?
ওউভিও

48

ফায়ারবেস খুব একটা রিলেশনাল ডাটাবেসের মতো নয় । আপনি যদি এটিকে কোনও কিছুর সাথে তুলনা করতে চান তবে আমি এটি একটি শ্রেণিবিন্যাসের ডাটাবেসের সাথে তুলনা করব।

অনন্ত সম্প্রতি ফায়ারবেস ব্লগে আপনার ডেটাটিকে ডেনার্মালাইজ করার বিষয়ে একটি দুর্দান্ত পোস্ট লিখেছেন: https://www.firebase.com/blog/2013-04-12-dororizing-is-normal.html

আমি প্রকৃতপক্ষে প্রতিটি আবেদনকারীর শিশু হিসাবে প্রতিটি আবেদনের "আইডি" রাখার পরামর্শ দিই


ধন্যবাদ ফ্র্যাঙ্ক! এটি সত্যই সহায়ক। ঠিক আমি খুঁজছেন ছিল কি !
হুপার

4

আপনার দৃশ্যটি সম্পর্কের বিশ্বে অনেকের কাছে একরকম লাগে, আপনার উদাহরণ অনুসারে একজন আবেদনকারীর অনেক অ্যাপ্লিকেশন রয়েছে। আমরা যদি ফায়ারবেস নোসকিএল পথে আসি তবে এটি নীচের মত দেখাচ্ছে like এটি কোনও পারফরম্যান্স সমস্যা ছাড়াই স্কেল করা উচিত। এজন্য নীচে উল্লিখিত হিসাবে আমাদের ডেনারমালাইজেশন প্রয়োজন

applicants:{
applicant1:{
    .
    .
    applications:{
        application1:true,
        application3:true
    }
},
applicant2:{
    .
    .
    applications:{
        application2:true,
        application4:true
    }
}}

applications:{
application1:{
    .
    .
},
application2:{
    .
    .
},
application3:{
    .
    .
},
application4:{
    .
    .
}}

ভাল তবে আমার ফলো-অন রয়েছে, আমরা কীভাবে সুইফট বা ফায়ারবেস এসডিকে ব্যবহার করে এই কাঠামোটি তৈরি করব? এছাড়াও আমরা কীভাবে যাচাই করতে পারি যে অ্যাপ্লিকেশন নোডে যুক্ত হওয়া নতুন ডেটা ফায়ারবেস যাচাইয়ের নিয়ম ব্যবহার করে অ্যাপ্লিকেশন তালিকায় রয়েছে?
টমি সি।

@ প্রদীপ, ভাল উদাহরণ। তবে এখানে সমস্যাটি হ'ল যখন আমি পথ অ্যাপ্লিকেশনগুলি / অ্যাপ্লিকেশন 1 মুছি যেখানে অ্যাপ্লিকেশন 1 কিছু আবেদনকারীর জন্য শিশু। আমি যদি পাথ আবেদনকারী / অ্যাপ্লিকেশন 1 অ্যাক্সেস করার চেষ্টা করি যা সেখানে নেই। সুতরাং আপনাকে অ্যাপ্লিকেশন 1: {আবেদনকারীদের: {আবেদনকারী 1: সত্য} ... like উভয় জায়গায় সূচি আপডেট করতে হবে তাই এখন আমি যখন আবেদনকরন 1 মুছে ফেলি তখন আমি এটির শিশু আবেদনকারীদের চেক করতে এবং আবেদনের জন্য শিশুদের নোড আপডেট করতে হবে। :)
সতীশ সোজিত্রা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.