আপডেট : ডেটা কাঠামোর বিষয়ে এখন একটি ডক রয়েছে । এছাড়াও, নোএসকিউএল ডেটা স্ট্রাকচারে এই দুর্দান্ত পোস্টটি দেখুন ।
আরডিবিএমএসের বিপরীতে, শ্রেণিবিন্যাস সম্পর্কিত ডেটা সহ প্রধান সমস্যাটি হ'ল এটি নীড়ের ডেটাগুলিকে লোভনীয় কারণ আমরা পারছি। সাধারণভাবে, আপনি যোগদানের বিবৃতি এবং প্রশ্নগুলির অভাব সত্ত্বেও কিছুটা পরিমাণে (যেমন আপনি এসকিউএল দিয়ে যাবেন) ডেটা স্বাভাবিক করতে চান।
আপনি যে জায়গাগুলিতে পড়ার দক্ষতা একটি উদ্বেগের বিষয়গুলিও অস্বীকার করতে চান । এটি একটি বৃহত স্কেল অ্যাপ্লিকেশন (যেমন টুইটার এবং ফেসবুক) দ্বারা ব্যবহৃত একটি কৌশল এবং যদিও এটি আমাদের 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));
আমি ড্যানারমালাইজিং ডেটা সম্পর্কে অন্য এসও পোস্টে কিছু বিশদ প্রস্তাব দিয়েছিলাম, সুতরাং সেগুলিও পরীক্ষা করে দেখুন । আমি দেখতে পাচ্ছি যে ফ্রাঙ্ক ইতিমধ্যে অনন্তের নিবন্ধটি পোস্ট করেছে, তাই আমি এখানে এটির পুনরাবৃত্তি করব না, তবে এটি একটি দুর্দান্ত পঠন।