যদি কোনও সংগ্রহে ক্রমিক সূচীবদ্ধ মান সহ নথি থাকে, তাহলে Cloud Firestore প্রতি সেকেন্ডে লেখার হার 500 টি লেখার মধ্যে সীমাবদ্ধ করে। এই পৃষ্ঠাটি বর্ণনা করে যে এই সীমা অতিক্রম করার জন্য একটি নথি ক্ষেত্রকে কীভাবে ছোট করা যায়। প্রথমে, "ক্রমিক সূচীবদ্ধ ক্ষেত্র" বলতে আমরা কী বোঝাতে চাই তা সংজ্ঞায়িত করা যাক এবং এই সীমা কখন প্রযোজ্য তা স্পষ্ট করা যাক।
ক্রমিক সূচীবদ্ধ ক্ষেত্র
"ক্রমিক সূচীকৃত ক্ষেত্র" বলতে এমন যেকোনো নথির সংগ্রহ বোঝায় যেখানে একঘেয়েমিপূর্ণভাবে ক্রমবর্ধমান বা হ্রাসমান সূচীকৃত ক্ষেত্র থাকে। অনেক ক্ষেত্রে, এর অর্থ একটি timestamp ক্ষেত্র, তবে যেকোনো একঘেয়েমিপূর্ণভাবে ক্রমবর্ধমান বা হ্রাসমান ক্ষেত্র মান প্রতি সেকেন্ডে ৫০০টি লেখার সীমা ট্রিগার করতে পারে।
উদাহরণস্বরূপ, যদি অ্যাপটি userid মান নির্ধারণ করে, তাহলে সীমাটি সূচিবদ্ধ ক্ষেত্র userid সহ user নথির সংগ্রহের ক্ষেত্রে প্রযোজ্য:
-
1281, 1282, 1283, 1284, 1285, ...
অন্যদিকে, সমস্ত timestamp ফিল্ড এই সীমাটি ট্রিগার করে না। যদি একটি timestamp ফিল্ড এলোমেলোভাবে বিতরণ করা মানগুলি ট্র্যাক করে, তাহলে লেখার সীমা প্রযোজ্য হয় না। ক্ষেত্রের প্রকৃত মানও গুরুত্বপূর্ণ নয়, কেবল ক্ষেত্রটি একঘেয়েভাবে বৃদ্ধি পাচ্ছে বা হ্রাস পাচ্ছে। উদাহরণস্বরূপ, একঘেয়েভাবে বৃদ্ধি পাওয়া ক্ষেত্রের মানগুলির নিম্নলিখিত দুটি সেট লেখার সীমাটি ট্রিগার করে:
-
100000, 100001, 100002, 100003, ... -
0, 1, 2, 3, ...
টাইমস্ট্যাম্প ক্ষেত্র ভাগ করা হচ্ছে
ধরে নিন আপনার অ্যাপটি একটি একঘেয়েভাবে বর্ধিত timestamp ফিল্ড ব্যবহার করে। যদি আপনার অ্যাপটি কোনও কোয়েরিতে timestamp ফিল্ড ব্যবহার না করে, তাহলে আপনি টাইমস্ট্যাম্প ফিল্ডটি ইনডেক্স না করে প্রতি সেকেন্ডে 500 লেখার সীমাটি সরিয়ে ফেলতে পারেন। যদি আপনার কোয়েরির জন্য একটি timestamp ফিল্ডের প্রয়োজন হয়, তাহলে আপনি sharded timestamps ব্যবহার করে সীমাটি অতিক্রম করতে পারেন:
-
timestampক্ষেত্রের পাশে একটিshardক্ষেত্র যোগ করুন।shardক্ষেত্রের জন্য1..nস্বতন্ত্র মান ব্যবহার করুন। এটি সংগ্রহের লেখার সীমা500*nএ বাড়িয়ে দেয়, তবে আপনাকেnকোয়েরিগুলিকে একত্রিত করতে হবে। - প্রতিটি ডকুমেন্টে এলোমেলোভাবে একটি
shardমান নির্ধারণ করতে আপনার লেখার যুক্তি আপডেট করুন। - খণ্ডিত ফলাফল সেটগুলিকে একত্রিত করতে আপনার প্রশ্নগুলি আপডেট করুন।
-
shardফিল্ড এবংtimestampফিল্ড উভয়ের জন্য সিঙ্গেল-ফিল্ড ইনডেক্স অক্ষম করুন।timestampফিল্ড ধারণকারী বিদ্যমান কম্পোজিট ইনডেক্সগুলি মুছুন। - আপনার আপডেট করা কোয়েরিগুলিকে সমর্থন করার জন্য নতুন কম্পোজিট ইনডেক্স তৈরি করুন। একটি ইনডেক্সে ফিল্ডগুলির ক্রম গুরুত্বপূর্ণ, এবং
shardফিল্ডটিtimestampফিল্ডের আগে আসতে হবে।timestampফিল্ড অন্তর্ভুক্ত থাকা যেকোনো ইনডেক্সেshardফিল্ডও অন্তর্ভুক্ত থাকতে হবে।
আপনার কেবল সেইসব ক্ষেত্রেই শার্ডেড টাইমস্ট্যাম্প প্রয়োগ করা উচিত যেখানে প্রতি সেকেন্ডে ৫০০ রাইটসের বেশি টেকসই লেখার হার থাকে। অন্যথায়, এটি একটি প্রি-ম্যাচিউর অপ্টিমাইজেশন। timestamp ফিল্ড শেয়ার করলে প্রতি সেকেন্ডে ৫০০ রাইটসের সীমাবদ্ধতা দূর হয় কিন্তু ক্লায়েন্ট-সাইড কোয়েরি অ্যাগ্রিগেশনের প্রয়োজন হয়।
নিম্নলিখিত উদাহরণগুলি দেখায় যে কীভাবে একটি timestamp ফিল্ডকে শার্ড করতে হয় এবং কীভাবে একটি শার্ডেড ফলাফল সেট কোয়েরি করতে হয়।
ডেটা মডেল এবং কোয়েরির উদাহরণ
উদাহরণস্বরূপ, মুদ্রা, সাধারণ স্টক এবং ETF-এর মতো আর্থিক উপকরণগুলির প্রায় রিয়েল-টাইম বিশ্লেষণের জন্য একটি অ্যাপ কল্পনা করুন। এই অ্যাপটি নিম্নলিখিত ধরণের instruments সংগ্রহে নথি লেখে:
নোড.জেএস
async function insertData() { const instruments = [ { symbol: 'AAA', price: { currency: 'USD', micros: 34790000 }, exchange: 'EXCHG1', instrumentType: 'commonstock', timestamp: Timestamp.fromMillis( Date.parse('2019-01-01T13:45:23.010Z')) }, { symbol: 'BBB', price: { currency: 'JPY', micros: 64272000000 }, exchange: 'EXCHG2', instrumentType: 'commonstock', timestamp: Timestamp.fromMillis( Date.parse('2019-01-01T13:45:23.101Z')) }, { symbol: 'Index1 ETF', price: { currency: 'USD', micros: 473000000 }, exchange: 'EXCHG1', instrumentType: 'etf', timestamp: Timestamp.fromMillis( Date.parse('2019-01-01T13:45:23.001Z')) } ]; const batch = fs.batch(); for (const inst of instruments) { const ref = fs.collection('instruments').doc(); batch.set(ref, inst); } await batch.commit(); }
এই অ্যাপটি timestamp ফিল্ড অনুসারে নিম্নলিখিত প্রশ্নগুলি এবং অর্ডারগুলি চালায়:
নোড.জেএস
function createQuery(fieldName, fieldOperator, fieldValue, limit = 5) { return fs.collection('instruments') .where(fieldName, fieldOperator, fieldValue) .orderBy('timestamp', 'desc') .limit(limit) .get(); } function queryCommonStock() { return createQuery('instrumentType', '==', 'commonstock'); } function queryExchange1Instruments() { return createQuery('exchange', '==', 'EXCHG1'); } function queryUSDInstruments() { return createQuery('price.currency', '==', 'USD'); }
insertData() .then(() => { const commonStock = queryCommonStock() .then( (docs) => { console.log('--- queryCommonStock: '); docs.forEach((doc) => { console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`); }); } ); const exchange1Instruments = queryExchange1Instruments() .then( (docs) => { console.log('--- queryExchange1Instruments: '); docs.forEach((doc) => { console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`); }); } ); const usdInstruments = queryUSDInstruments() .then( (docs) => { console.log('--- queryUSDInstruments: '); docs.forEach((doc) => { console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`); }); } ); return Promise.all([commonStock, exchange1Instruments, usdInstruments]); });
কিছু গবেষণার পর, আপনি নির্ধারণ করেন যে অ্যাপটি প্রতি সেকেন্ডে ১,০০০ থেকে ১,৫০০টি ইন্সট্রুমেন্ট আপডেট পাবে। এটি ইনডেক্সড টাইমস্ট্যাম্প ফিল্ড সহ ডকুমেন্ট ধারণকারী সংগ্রহের জন্য প্রতি সেকেন্ডে ৫০০টি লেখার চেয়েও বেশি। লেখার থ্রুপুট বাড়ানোর জন্য, আপনার ৩টি শার্ড মান প্রয়োজন, MAX_INSTRUMENT_UPDATES/500 = 3 এই উদাহরণে শার্ড মান x , y , এবং z ব্যবহার করা হয়েছে। আপনি আপনার শার্ড মানের জন্য সংখ্যা বা অন্যান্য অক্ষরও ব্যবহার করতে পারেন।
একটি শার্ড ফিল্ড যোগ করা হচ্ছে
আপনার ডকুমেন্টে একটি shard ফিল্ড যোগ করুন। shard ফিল্ডের মান x , y , অথবা z এ সেট করুন যা সংগ্রহের লেখার সীমা প্রতি সেকেন্ডে ১,৫০০ লেখায় উন্নীত করে।
নোড.জেএস
// Define our 'K' shard values const shards = ['x', 'y', 'z']; // Define a function to help 'chunk' our shards for use in queries. // When using the 'in' query filter there is a max number of values that can be // included in the value. If our number of shards is higher than that limit // break down the shards into the fewest possible number of chunks. function shardChunks() { const chunks = []; let start = 0; while (start < shards.length) { const elements = Math.min(MAX_IN_VALUES, shards.length - start); const end = start + elements; chunks.push(shards.slice(start, end)); start = end; } return chunks; } // Add a convenience function to select a random shard function randomShard() { return shards[Math.floor(Math.random() * Math.floor(shards.length))]; }
async function insertData() { const instruments = [ { shard: randomShard(), // add the new shard field to the document symbol: 'AAA', price: { currency: 'USD', micros: 34790000 }, exchange: 'EXCHG1', instrumentType: 'commonstock', timestamp: Timestamp.fromMillis( Date.parse('2019-01-01T13:45:23.010Z')) }, { shard: randomShard(), // add the new shard field to the document symbol: 'BBB', price: { currency: 'JPY', micros: 64272000000 }, exchange: 'EXCHG2', instrumentType: 'commonstock', timestamp: Timestamp.fromMillis( Date.parse('2019-01-01T13:45:23.101Z')) }, { shard: randomShard(), // add the new shard field to the document symbol: 'Index1 ETF', price: { currency: 'USD', micros: 473000000 }, exchange: 'EXCHG1', instrumentType: 'etf', timestamp: Timestamp.fromMillis( Date.parse('2019-01-01T13:45:23.001Z')) } ]; const batch = fs.batch(); for (const inst of instruments) { const ref = fs.collection('instruments').doc(); batch.set(ref, inst); } await batch.commit(); }
খণ্ডিত টাইমস্ট্যাম্পটি অনুসন্ধান করা হচ্ছে
একটি shard ক্ষেত্র যোগ করার জন্য আপনাকে sharded ফলাফলগুলিকে একত্রিত করার জন্য আপনার প্রশ্নগুলি আপডেট করতে হবে:
নোড.জেএস
function createQuery(fieldName, fieldOperator, fieldValue, limit = 5) { // For each shard value, map it to a new query which adds an additional // where clause specifying the shard value. return Promise.all(shardChunks().map(shardChunk => { return fs.collection('instruments') .where('shard', 'in', shardChunk) // new shard condition .where(fieldName, fieldOperator, fieldValue) .orderBy('timestamp', 'desc') .limit(limit) .get(); })) // Now that we have a promise of multiple possible query results, we need // to merge the results from all of the queries into a single result set. .then((snapshots) => { // Create a new container for 'all' results const docs = []; snapshots.forEach((querySnapshot) => { querySnapshot.forEach((doc) => { // append each document to the new all container docs.push(doc); }); }); if (snapshots.length === 1) { // if only a single query was returned skip manual sorting as it is // taken care of by the backend. return docs; } else { // When multiple query results are returned we need to sort the // results after they have been concatenated. // // since we're wanting the `limit` newest values, sort the array // descending and take the first `limit` values. By returning negated // values we can easily get a descending value. docs.sort((a, b) => { const aT = a.data().timestamp; const bT = b.data().timestamp; const secondsDiff = aT.seconds - bT.seconds; if (secondsDiff === 0) { return -(aT.nanoseconds - bT.nanoseconds); } else { return -secondsDiff; } }); return docs.slice(0, limit); } }); } function queryCommonStock() { return createQuery('instrumentType', '==', 'commonstock'); } function queryExchange1Instruments() { return createQuery('exchange', '==', 'EXCHG1'); } function queryUSDInstruments() { return createQuery('price.currency', '==', 'USD'); }
insertData() .then(() => { const commonStock = queryCommonStock() .then( (docs) => { console.log('--- queryCommonStock: '); docs.forEach((doc) => { console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`); }); } ); const exchange1Instruments = queryExchange1Instruments() .then( (docs) => { console.log('--- queryExchange1Instruments: '); docs.forEach((doc) => { console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`); }); } ); const usdInstruments = queryUSDInstruments() .then( (docs) => { console.log('--- queryUSDInstruments: '); docs.forEach((doc) => { console.log(`doc = ${util.inspect(doc.data(), {depth: 4})}`); }); } ); return Promise.all([commonStock, exchange1Instruments, usdInstruments]); });
সূচকের সংজ্ঞা আপডেট করুন
প্রতি সেকেন্ডে ৫০০ লেখার সীমাবদ্ধতা অপসারণ করতে, timestamp ক্ষেত্র ব্যবহার করে এমন বিদ্যমান একক-ক্ষেত্র এবং যৌগিক সূচকগুলি মুছে ফেলুন।
কম্পোজিট ইনডেক্স সংজ্ঞা মুছে ফেলুন
ফায়ারবেস কনসোল
Firebase কনসোলে Cloud Firestore Composite Indexes পৃষ্ঠাটি খুলুন।
timestampক্ষেত্র ধারণকারী প্রতিটি সূচীর জন্য, বোতামে ক্লিক করুন এবং Delete এ ক্লিক করুন।
জিসিপি কনসোল
গুগল ক্লাউড কনসোলে, ডাটাবেস পৃষ্ঠায় যান।
ডাটাবেসের তালিকা থেকে প্রয়োজনীয় ডাটাবেস নির্বাচন করুন।
নেভিগেশন মেনুতে, Indexes এ ক্লিক করুন, এবং তারপর Composite ট্যাবে ক্লিক করুন।
timestampক্ষেত্র ধারণকারী সূচক সংজ্ঞা অনুসন্ধান করতে ফিল্টার ক্ষেত্রটি ব্যবহার করুন।এই প্রতিটি সূচীর জন্য, বোতামে ক্লিক করুন এবং Delete এ ক্লিক করুন।
ফায়ারবেস সিএলআই
- যদি আপনি Firebase CLI সেট আপ না করে থাকেন, তাহলে CLI ইনস্টল করতে এবং
firebase initকমান্ডটি চালাতে এই নির্দেশাবলী অনুসরণ করুন ।initকমান্ডের সময়,Firestore: Deploy rules and create indexes for Firestore। - সেটআপের সময়, Firebase CLI আপনার বিদ্যমান সূচক সংজ্ঞাগুলি ডিফল্টরূপে
firestore.indexes.jsonনামে একটি ফাইলে ডাউনলোড করে। timestampফিল্ড ধারণকারী যেকোনো সূচক সংজ্ঞা সরিয়ে ফেলুন, উদাহরণস্বরূপ:{ "indexes": [ // Delete composite index definition that contain the timestamp field { "collectionGroup": "instruments", "queryScope": "COLLECTION", "fields": [ { "fieldPath": "exchange", "order": "ASCENDING" }, { "fieldPath": "timestamp", "order": "DESCENDING" } ] }, { "collectionGroup": "instruments", "queryScope": "COLLECTION", "fields": [ { "fieldPath": "instrumentType", "order": "ASCENDING" }, { "fieldPath": "timestamp", "order": "DESCENDING" } ] }, { "collectionGroup": "instruments", "queryScope": "COLLECTION", "fields": [ { "fieldPath": "price.currency", "order": "ASCENDING" }, { "fieldPath": "timestamp", "order": "DESCENDING" } ] }, ] }আপনার আপডেট করা সূচক সংজ্ঞাগুলি স্থাপন করুন:
firebase deploy --only firestore:indexes
একক-ক্ষেত্র সূচক সংজ্ঞা আপডেট করুন
ফায়ারবেস কনসোল
Firebase কনসোলে Cloud Firestore Single Field Indexes পৃষ্ঠাটি খুলুন।
ছাড় যোগ করুন ক্লিক করুন।
সংগ্রহ আইডির জন্য,
instrumentsলিখুন। ফিল্ড পাথের জন্য,timestampলিখুন।কোয়েরি স্কোপের অধীনে, সংগ্রহ এবং সংগ্রহ গ্রুপ উভয়ই নির্বাচন করুন।
পরবর্তী ক্লিক করুন
সকল ইনডেক্স সেটিংস Disabled এ টগল করুন। Save এ ক্লিক করুন।
shardফিল্ডের জন্য একই ধাপগুলি পুনরাবৃত্তি করুন।
জিসিপি কনসোল
গুগল ক্লাউড কনসোলে, ডাটাবেস পৃষ্ঠায় যান।
ডাটাবেসের তালিকা থেকে প্রয়োজনীয় ডাটাবেস নির্বাচন করুন।
নেভিগেশন মেনুতে, Indexes এ ক্লিক করুন, এবং তারপর Single Field ট্যাবে ক্লিক করুন।
সিঙ্গেল ফিল্ড ট্যাবে ক্লিক করুন।
ছাড় যোগ করুন ক্লিক করুন।
সংগ্রহ আইডির জন্য,
instrumentsলিখুন। ফিল্ড পাথের জন্য,timestampলিখুন।কোয়েরি স্কোপের অধীনে, সংগ্রহ এবং সংগ্রহ গ্রুপ উভয়ই নির্বাচন করুন।
পরবর্তী ক্লিক করুন
সকল ইনডেক্স সেটিংস Disabled এ টগল করুন। Save এ ক্লিক করুন।
shardফিল্ডের জন্য একই ধাপগুলি পুনরাবৃত্তি করুন।
ফায়ারবেস সিএলআই
আপনার ইনডেক্স ডেফিনিশন ফাইলের
fieldOverridesবিভাগে নিম্নলিখিতটি যোগ করুন:{ "fieldOverrides": [ // Disable single-field indexing for the timestamp field { "collectionGroup": "instruments", "fieldPath": "timestamp", "indexes": [] }, ] }আপনার আপডেট করা সূচক সংজ্ঞাগুলি স্থাপন করুন:
firebase deploy --only firestore:indexes
নতুন কম্পোজিট ইনডেক্স তৈরি করুন
timestamp সম্বলিত পূর্ববর্তী সকল সূচী মুছে ফেলার পর, আপনার অ্যাপের জন্য প্রয়োজনীয় নতুন সূচী নির্ধারণ করুন। timestamp ক্ষেত্র সম্বলিত যেকোনো সূচীতে অবশ্যই shard ক্ষেত্রটি থাকতে হবে। উদাহরণস্বরূপ, উপরের প্রশ্নগুলি সমর্থন করার জন্য, নিম্নলিখিত সূচীগুলি যোগ করুন:
| সংগ্রহ | সূচীবদ্ধ ক্ষেত্রগুলি | কোয়েরির সুযোগ |
|---|---|---|
| যন্ত্র | দিকে, মূল্য.মুদ্রা, টাইমস্ট্যাম্প | সংগ্রহ |
| যন্ত্র | অংশ, বিনিময়, টাইমস্ট্যাম্প | সংগ্রহ |
| যন্ত্র | অংশ, যন্ত্রের ধরণ, টাইমস্ট্যাম্প | সংগ্রহ |
ত্রুটি বার্তা
আপডেট করা কোয়েরিগুলি চালিয়ে আপনি এই সূচীগুলি তৈরি করতে পারেন।
প্রতিটি কোয়েরি ফায়ারবেস কনসোলে প্রয়োজনীয় সূচক তৈরি করার জন্য একটি লিঙ্ক সহ একটি ত্রুটি বার্তা ফেরত দেয়।
ফায়ারবেস সিএলআই
আপনার সূচক সংজ্ঞা ফাইলে নিম্নলিখিত সূচীগুলি যোগ করুন:
{ "indexes": [ // New indexes for sharded timestamps { "collectionGroup": "instruments", "queryScope": "COLLECTION", "fields": [ { "fieldPath": "shard", "order": "DESCENDING" }, { "fieldPath": "exchange", "order": "ASCENDING" }, { "fieldPath": "timestamp", "order": "DESCENDING" } ] }, { "collectionGroup": "instruments", "queryScope": "COLLECTION", "fields": [ { "fieldPath": "shard", "order": "DESCENDING" }, { "fieldPath": "instrumentType", "order": "ASCENDING" }, { "fieldPath": "timestamp", "order": "DESCENDING" } ] }, { "collectionGroup": "instruments", "queryScope": "COLLECTION", "fields": [ { "fieldPath": "shard", "order": "DESCENDING" }, { "fieldPath": "price.currency", "order": "ASCENDING" }, { "fieldPath": "timestamp", "order": "DESCENDING" } ] }, ] }আপনার আপডেট করা সূচক সংজ্ঞাগুলি স্থাপন করুন:
firebase deploy --only firestore:indexes
ক্রমিক সূচীকৃত ক্ষেত্রগুলির লেখার সীমা বোঝা
ক্রমিক সূচীকৃত ক্ষেত্রগুলির জন্য লেখার হারের সীমা Cloud Firestore কীভাবে সূচকের মান সংরক্ষণ করে এবং সূচকের লেখার স্কেল করে তা থেকে আসে। প্রতিটি সূচক লেখার জন্য, Cloud Firestore একটি কী-মান এন্ট্রি সংজ্ঞায়িত করে যা ডকুমেন্টের নাম এবং প্রতিটি সূচীকৃত ক্ষেত্রের মানকে একত্রিত করে। Cloud Firestore এই সূচক এন্ট্রিগুলিকে ট্যাবলেট নামক ডেটার গ্রুপে সংগঠিত করে। প্রতিটি Cloud Firestore সার্ভার এক বা একাধিক ট্যাবলেট ধারণ করে। যখন একটি নির্দিষ্ট ট্যাবলেটে লেখার লোড খুব বেশি হয়ে যায়, তখন Cloud Firestore ট্যাবলেটটিকে ছোট ট্যাবলেটে বিভক্ত করে এবং নতুন ট্যাবলেটগুলিকে বিভিন্ন Cloud Firestore সার্ভারে ছড়িয়ে দিয়ে অনুভূমিকভাবে স্কেল করে।
Cloud Firestore একই ট্যাবলেটে লেক্সিকোগ্রাফিকভাবে কাছাকাছি সূচক এন্ট্রি রাখে। যদি ট্যাবলেটের সূচক মানগুলি খুব কাছাকাছি থাকে, যেমন টাইমস্ট্যাম্প ক্ষেত্রের জন্য, Cloud Firestore দক্ষতার সাথে ট্যাবলেটটিকে ছোট ট্যাবলেটে বিভক্ত করতে পারে না। এটি একটি হট স্পট তৈরি করে যেখানে একটি একক ট্যাবলেট খুব বেশি ট্র্যাফিক পায় এবং হট স্পটে পড়ার এবং লেখার কাজ ধীর হয়ে যায়।
একটি টাইমস্ট্যাম্প ফিল্ডকে আলাদা করে রাখার মাধ্যমে, আপনি Cloud Firestore জন্য একাধিক ট্যাবলেটের মধ্যে কাজের চাপ দক্ষতার সাথে ভাগ করা সম্ভব করে তোলেন। যদিও টাইমস্ট্যাম্প ফিল্ডের মানগুলি একসাথে কাছাকাছি থাকতে পারে, তবে সংযুক্ত শার্ড এবং সূচক মান Cloud Firestore একাধিক ট্যাবলেটের মধ্যে এন্ট্রিগুলিকে বিভক্ত করার জন্য সূচক এন্ট্রিগুলির মধ্যে পর্যাপ্ত স্থান দেয়।
এরপর কি?
- স্কেল ডিজাইনের জন্য সেরা অনুশীলনগুলি পড়ুন।
- একটি একক নথিতে লেখার হার বেশি হলে, ডিস্ট্রিবিউটেড কাউন্টার দেখুন।
- Cloud Firestore জন্য আদর্শ সীমা দেখুন