आवश्यकताओं का विश्लेषण और स्कीमा डिज़ाइन
शिक्षार्थी एप्लिकेशन की आवश्यकताओं को MongoDB स्कीमा में बदलेंगे, एम्बेडिंग और संदर्भण में चयन करेंगे तथा डिज़ाइन पैटर्न उचित रूप से लागू करेंगे।
आवश्यकताओं का विश्लेषण और स्कीमा डिज़ाइन, CoddyKit पर MongoDB Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह MongoDB Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
अंतिम परियोजना: वास्तविक एप्लिकेशन तैयार करना
इस अंतिम परियोजना वाले पाठ में आप MongoDB ट्रैक से मिली सारी जानकारी का उपयोग करके शुरू से उत्पादन के लिए तैयार एप्लिकेशन तैयार करेंगे। हम एक बहु-विक्रेता ई-कॉमर्स प्लेटफ़ॉर्म बनाएँगे — ऐसा क्षेत्र जिसमें एम्बेड करने बनाम संदर्भ देने के निर्णय, इंडेक्स की योजना, एकत्रीकरण का डिज़ाइन और सुरक्षा, सभी का अभ्यास किया जा सके। प्रक्रिया आवश्यकताओं के विश्लेषण से शुरू होती है, जो इसके बाद लिए जाने वाले हर स्कीमा निर्णय को दिशा देता है।
चरण 1: कार्यात्मक आवश्यकताएँ एकत्र करें
एप्लिकेशन की मुख्य इकाइयों और कार्यों की सूची बनाकर शुरुआत करें। हमारे ई-कॉमर्स प्लेटफ़ॉर्म के लिए: इकाइयाँ — उपयोगकर्ता, विक्रेता, उत्पाद, ऑर्डर, समीक्षाएँ, कार्ट; कार्य — श्रेणी के अनुसार उत्पाद ब्राउज़ करना, कीवर्ड से खोजना, ऑर्डर देना, भुगतान संसाधित करना, शिपमेंट ट्रैक करना और समीक्षाएँ लिखना। हर कार्य एक या अधिक MongoDB क्वेरी से जुड़ा होता है और वही क्वेरी स्कीमा से जुड़े निर्णयों को दिशा देती हैं।
// Requirement analysis output (pseudocode spec)
const requirements = {
reads: [
'Get product by slug (very high frequency)',
'List products by category + sort/filter (high frequency)',
'Search products by keyword (high frequency)',
'Get order history for a user (medium frequency)',
'Get order detail (medium frequency)'
],
writes: [
'Create order (medium frequency)',
'Update order status (medium frequency)',
'Add product review (low frequency)',
'Update product inventory (high frequency)'
]
}चरण 2: accessPatterns पहचानें
accessPatterns वे विशिष्ट क्वेरी हैं जिन्हें आपका एप्लिकेशन चलाएगा। स्कीमा तैयार करने से पहले उन्हें सटीक रूप से दर्ज करें — स्कीमा को क्वेरी के अनुरूप होना चाहिए, इसका उलटा नहीं। हर पैटर्न के लिए फ़िल्टर फ़ील्ड, sort फ़ील्ड, दिखाए जाने वाले फ़ील्ड और अनुमानित आवृत्ति दर्ज करें। अधिक बार चलने वाले पैटर्न इंडेक्स और एम्बेड करने से जुड़े निर्णयों को दिशा देते हैं। कम बार चलने वाले पैटर्न जॉइन या एकत्रीकरण pipeline के अतिरिक्त भार को सहन कर सकते हैं।
// Access pattern register
const accessPatterns = [
{
name: 'Product page',
filter: { slug: 1 },
projection: 'all except internal fields',
frequency: 'very high',
decision: 'index on slug; embed top 5 reviews'
},
{
name: 'Category listing',
filter: { categoryId: 1, price: 1 },
sort: { price: 1, createdAt: -1 },
frequency: 'high',
decision: 'compound index { categoryId, price, createdAt }'
}
]Products collection तैयार करना
product दस्तावेज़ सिस्टम में सबसे अधिक पढ़ा जाने वाला दस्तावेज़ है। सीखे गए पैटर्न लागू करें: पहले से निकाले गए आँकड़ों (avgRating, reviewCount) के लिए Computed Pattern; केवल शीर्ष 5 समीक्षाओं को एम्बेड करने के लिए Subset Pattern; और vendorId के साथ विक्रेता का नाम और लोगो एम्बेड करने के लिए Extended Reference। इससे product पेज के 95% रेंडर के लिए जॉइन की आवश्यकता समाप्त हो जाती है।
// Product document schema (simplified)
{
_id: ObjectId(),
slug: 'wireless-headphones-pro',
name: 'Wireless Headphones Pro',
categoryId: ObjectId(),
vendor: {
_id: ObjectId(), // reference for updates
name: 'AudioTech Ltd', // Extended Reference
logoUrl: '...' // Extended Reference
},
price: 149.99,
stock: 234,
avgRating: 4.3, // Computed Pattern
reviewCount: 892, // Computed Pattern
topReviews: [ /* 5 most recent */ ], // Subset Pattern
tags: ['audio', 'wireless', 'headphones'],
schema_version: 1
}Orders collection तैयार करना
ऑर्डर एक सामान्य स्नैपशॉट दस्तावेज़ होते हैं: वे खरीदारी के समय की कीमतों और पतों की स्थिति सहेजते हैं, वर्तमान स्थिति नहीं। पूरा shipping address एम्बेड करें (उपयोगकर्ता के वर्तमान पते का संदर्भ नहीं), product का स्नैपशॉट (खरीदारी के समय का नाम, कीमत और image) तथा विक्रेता का नाम भी एम्बेड करें। इससे कीमतें बदलने या विक्रेता अपनी प्रोफ़ाइल अपडेट करने पर भी ऑर्डर सटीक बने रहते हैं।
// Order document schema
{
_id: ObjectId(),
userId: ObjectId(),
status: 'processing', // 'pending', 'processing', 'shipped', 'delivered', 'refunded'
createdAt: new Date(),
shippingAddress: {
name: 'Alice Smith',
street: '42 Elm St',
city: 'Istanbul',
country: 'TR'
},
items: [
{
productId: ObjectId(), // reference for linking
slug: 'wireless-...',
name: 'Wireless Headphones Pro', // snapshot
price: 149.99, // price at purchase time
quantity: 1,
imageUrl: '...'
}
],
subtotal: 149.99,
tax: 27.00,
total: 176.99
}स्कीमा डिज़ाइन निर्णय फ़्रेमवर्क लागू करना
हर संबंध के लिए निर्णय-सूची लागू करें: इसे एक साथ कितनी बार एक्सेस किया जाता है? (हमेशा हो तो एम्बेड करें, कम ही हो तो संदर्भ दें); संदर्भित डेटा कितनी बार बदलता है? (कम बदलता हो तो एम्बेड करें, अक्सर बदलता हो तो संदर्भ दें); क्या एम्बेड की गई array बिना सीमा के बढ़ेगी? (हाँ हो तो संदर्भ दें, सीमित हो तो एम्बेड करें); क्या डेटा को स्वतंत्र रूप से क्वेरी किया जाता है? (हाँ हो तो अलग collection रखें, हमेशा parent के माध्यम से एक्सेस होता हो तो एम्बेड करें)।
// Decision table for our e-commerce schema
const decisions = [
{ entity: 'Order items', decision: 'embed', reason: 'always fetched with order; price snapshot required' },
{ entity: 'Shipping address', decision: 'embed', reason: 'snapshot at purchase time; changes do not affect order' },
{ entity: 'Product reviews', decision: 'separate + subset', reason: 'grows unbounded; top-5 subset in product doc' },
{ entity: 'Vendor details', decision: 'extended ref', reason: 'name/logo read on every product page; changes rarely' },
{ entity: 'Category tree', decision: 'separate', reason: 'queried independently; used for breadcrumbs' }
]महत्वपूर्ण collections के लिए स्कीमा सत्यापन
आपके डेटा को गलत दस्तावेज़ों से खराब होने से बचाने के लिए products और orders collections में JSON Schema validators जोड़ें। आवश्यक फ़ील्ड लागू करें (price धनात्मक संख्या होनी चाहिए और status मान्य enum मानों में से एक होना चाहिए) तथा validationAction: 'error' सेट करें, ताकि अमान्य writes को केवल चेतावनी देने के बजाय तुरंत अस्वीकार किया जा सके।
db.runCommand({
collMod: 'orders',
validator: {
$jsonSchema: {
bsonType: 'object',
required: ['userId', 'status', 'items', 'total', 'createdAt'],
properties: {
status: {
bsonType: 'string',
enum: ['pending', 'processing', 'shipped', 'delivered', 'refunded']
},
total: { bsonType: 'double', minimum: 0 },
items: { bsonType: 'array', minItems: 1 }
}
}
},
validationAction: 'error'
})इंडेक्स सेट की योजना बनाना
हर अधिक बार उपयोग होने वाले accessPatterns के लिए इंडेक्स तय करें। compound indexes के लिए ESR नियम (Equality → Sort → Range) का उपयोग करें। केवल उन क्वेरी के लिए इंडेक्स बनाएँ जो अक्सर चलती हैं — अप्रयुक्त इंडेक्स write प्रदर्शन और RAM को व्यर्थ खर्च करते हैं। हर इंडेक्स का उद्देश्य दर्ज करें, ताकि accessPatterns बदलने पर टीम अनावश्यक इंडेक्स हटा सके।
// Products collection indexes
db.products.createIndex({ slug: 1 }, { unique: true }) // product page lookup
db.products.createIndex({ categoryId: 1, price: 1, _id: 1 }) // category listing + keyset pagination
db.products.createIndex({ tags: 1 }) // tag filter
db.products.createIndex({ 'vendor._id': 1 }) // vendor store page
// Orders collection indexes
db.orders.createIndex({ userId: 1, createdAt: -1 }) // user order history
db.orders.createIndex({ status: 1, createdAt: 1 }) // fulfillment queueसमवर्ती Inventory अपडेट संभालना
ई-कॉमर्स की एक महत्वपूर्ण चुनौती है अधिक बिक्री रोकना: ऐसा नहीं होना चाहिए कि दो उपयोगकर्ता स्टॉक की आखिरी वस्तु दोनों खरीद लें। MongoDB के atomic findOneAndUpdate का उपयोग stock: { $gt: 0 } guard condition के साथ करें। अपडेट तभी सफल होता है जब स्टॉक उपलब्ध हो, और कमी atomic होती है — race condition की कोई संभावना नहीं रहती।
// Atomically reserve stock — returns null if out of stock
const product = await db.collection('products').findOneAndUpdate(
{ _id: productId, stock: { $gte: quantity } }, // guard: enough stock
{ $inc: { stock: -quantity } },
{ returnDocument: 'after', projection: { stock: 1, name: 1, price: 1 } }
)
if (!product) {
throw new Error('Insufficient stock')
}
// Proceed to create order with product snapshotरिपोर्टिंग के लिए Aggregation pipeline
पिछले 30 दिनों के लिए विक्रेता के अनुसार revenue दिखाने वाली sales summary aggregation pipeline तैयार करें। यह ऐसा सामान्य मामला है जहाँ aggregation pipeline एप्लिकेशन-साइड की जटिल गणना का स्थान लेती है। pipeline हाल के ऑर्डर चुनती है, items को अलग-अलग करती है, विक्रेता के अनुसार समूह बनाती है और total revenue के आधार पर क्रमबद्ध करती है।
// Revenue by vendor, last 30 days
const since = new Date(Date.now() - 30 * 86400000)
db.orders.aggregate([
{ $match: { status: 'delivered', createdAt: { $gte: since } } },
{ $unwind: '$items' },
{
$group: {
_id: '$items.vendorId',
totalRevenue: { $sum: { $multiply: ['$items.price', '$items.quantity'] } },
orderCount: { $addToSet: '$_id' }
}
},
{ $addFields: { orderCount: { $size: '$orderCount' } } },
{ $sort: { totalRevenue: -1 } },
{ $limit: 20 }
])explain() से स्कीमा का परीक्षण
उत्पादन में भेजने से पहले हर महत्वपूर्ण क्वेरी को explain('executionStats') से सत्यापित करें। सुनिश्चित करें कि सभी अधिक बार चलने वाली क्वेरी winning plan में IXSCAN (न कि COLLSCAN) दिखाएँ, docsExamined का मान nReturned के करीब हो और totalKeysExamined उचित हो। COLLSCAN दिखाने वाली या docsExamined/nReturned का अनुपात अधिक रखने वाली किसी भी क्वेरी को इंडेक्स की आवश्यकता है।
// Validate the category listing query
const stats = db.products.find(
{ categoryId: ObjectId('...'), price: { $lte: 200 } }
).sort({ price: 1 }).explain('executionStats')
const plan = stats.executionStats
console.log('Stage:', plan.executionStages.inputStage.stage) // should be IXSCAN
console.log('Keys examined:', plan.totalKeysExamined) // should be small
console.log('Docs examined:', plan.totalDocsExamined) // should equal nReturned
console.log('Docs returned:', plan.nReturned)त्वरित जाँच
इस पाठ में MongoDB और NoSQL Database की अवधारणाओं की अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: आवश्यकताओं का विश्लेषण और accessPatterns का दस्तावेज़ीकरण स्कीमा डिज़ाइन से पहले आते हैं — स्कीमा क्वेरी की सेवा करता है, इसका उलटा नहीं; एक अच्छा product दस्तावेज़ Extended Reference, Computed Pattern और Subset Pattern को मिलाकर बार-बार पढ़े जाने वाले मार्ग पर जॉइन समाप्त करता है; और guard conditions के साथ atomic findOneAndUpdate transactions की आवश्यकता के बिना अधिक बिक्री को रोकता है। अब हम इंडेक्स रणनीति तय करेंगे और प्रत्येक इंडेक्स को explain() से सत्यापित करेंगे।
एआई शिक्षक के साथ JavaScript सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “आवश्यकताओं का विश्लेषण और स्कीमा डिज़ाइन” पाठ निःशुल्क है?
हाँ—“आवश्यकताओं का विश्लेषण और स्कीमा डिज़ाइन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और MongoDB Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“आवश्यकताओं का विश्लेषण और स्कीमा डिज़ाइन” में मैं क्या सीखूँगा?
शिक्षार्थी एप्लिकेशन की आवश्यकताओं को MongoDB स्कीमा में बदलेंगे, एम्बेडिंग और संदर्भण में चयन करेंगे तथा डिज़ाइन पैटर्न उचित रूप से लागू करेंगे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ MongoDB Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या MongoDB Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर MongoDB Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“आवश्यकताओं का विश्लेषण और स्कीमा डिज़ाइन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस MongoDB Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर MongoDB Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- आवश्यकताओं का विश्लेषण और स्कीमा डिज़ाइन
- इंडेक्स रणनीति और क्वेरी प्लानर का सत्यापन
- स्केलिंग योजना: रेप्लिका सेट से शार्डेड क्लस्टर तक
- सुरक्षा सुदृढ़ीकरण और प्रोडक्शन जाँचसूची