मैं इस तरह की योजना MongoDB में कैसे तैयार करूं? मुझे लगता है कि कोई विदेशी कुंजी नहीं है!
मैं इस तरह की योजना MongoDB में कैसे तैयार करूं? मुझे लगता है कि कोई विदेशी कुंजी नहीं है!
जवाबों:
आप ORM जैसे Mongoid या MongoMapper का उपयोग करने में रुचि रख सकते हैं।
http://mongoid.org/docs/relations/referenced/1-n.html
MongoDB जैसे NoSQL डेटाबेस में 'टेबल' नहीं बल्कि संग्रह हैं। दस्तावेजों को संग्रह के अंदर समूहीकृत किया जाता है। आपके पास किसी भी तरह के दस्तावेज़ - किसी भी तरह के डेटा के साथ - एक ही संग्रह में हो सकते हैं। मूल रूप से, NoSQL डेटाबेस में यह तय करना है कि डेटा और उसके संबंधों को कैसे व्यवस्थित किया जाए, यदि कोई हो।
Mongoid और MongoMapper क्या करते हैं जो आपको संबंधों को आसानी से स्थापित करने के लिए सुविधाजनक तरीके प्रदान करते हैं। मेरे द्वारा दी गई लिंक को देखें और कोई भी बात पूछें।
संपादित करें:
मूंगॉइड में आप अपनी योजना इस तरह लिखेंगे:
class Student
include Mongoid::Document
field :name
embeds_many :addresses
embeds_many :scores
end
class Address
include Mongoid::Document
field :address
field :city
field :state
field :postalCode
embedded_in :student
end
class Score
include Mongoid::Document
belongs_to :course
field :grade, type: Float
embedded_in :student
end
class Course
include Mongoid::Document
field :name
has_many :scores
end
संपादित करें:
> db.foo.insert({group:"phones"})
> db.foo.find()
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }
{ "_id" : ObjectId("4df6540fe90592692ccc9941"), "group" : "phones" }
>db.foo.find({'_id':ObjectId("4df6539ae90592692ccc9940")})
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }
दस्तावेजों के बीच संबंध बनाने के लिए आप उस ObjectId का उपयोग कर सकते हैं।
मोंगोडब में इस तरह से टेबल कैसे डिज़ाइन करें?
सबसे पहले, कुछ नामकरण सम्मेलनों को स्पष्ट करने के लिए। collections
इसके बजाय MongoDB का उपयोग करता है tables
।
मुझे लगता है कि कोई विदेशी कुंजी नहीं है!
निम्नलिखित मॉडल लें:
student
{
_id: ObjectId(...),
name: 'Jane',
courses: [
{ course: 'bio101', mark: 85 },
{ course: 'chem101', mark: 89 }
]
}
course
{
_id: 'bio101',
name: 'Biology 101',
description: 'Introduction to biology'
}
स्पष्ट रूप से जेन की पाठ्यक्रम सूची कुछ विशिष्ट पाठ्यक्रमों की ओर इशारा करती है। डेटाबेस सिस्टम में कोई बाधा नहीं लागू करता है ( यानी: विदेशी कुंजी बाधाएं ), इसलिए "कैस्केडिंग डिलीट" या "कैस्केडिंग अपडेट" नहीं हैं। हालाँकि, डेटाबेस में सही जानकारी है।
इसके अलावा, MongoDB में DBRef मानक है जो इन संदर्भों के निर्माण को मानकीकृत करने में मदद करता है। वास्तव में, यदि आप उस लिंक पर एक नज़र डालते हैं, तो इसका एक समान उदाहरण है।
मैं इस कार्य को कैसे हल कर सकता हूं?
स्पष्ट होने के लिए, MongoDB संबंधपरक नहीं है। कोई मानक "सामान्य रूप" नहीं है। आपको अपना डेटाबेस आपके द्वारा संग्रहीत डेटा और आपके द्वारा चलाए जाने वाले प्रश्नों के लिए उपयुक्त होना चाहिए।
हम foreign key
MongoDB में तथाकथित परिभाषित कर सकते हैं । हालांकि, हम डेटा अखंडता को बनाए रखने की जरूरत है अपने आप से । उदाहरण के लिए,
student
{
_id: ObjectId(...),
name: 'Jane',
courses: ['bio101', 'bio102'] // <= ids of the courses
}
course
{
_id: 'bio101',
name: 'Biology 101',
description: 'Introduction to biology'
}
इस courses
क्षेत्र में _id
पाठ्यक्रम शामिल हैं। एक-से-कई संबंधों को परिभाषित करना आसान है। हालांकि, अगर हम छात्र के पाठ्यक्रम के नाम को पुनः प्राप्त करना चाहते हैं, तो हमें दस्तावेज़ Jane
को पुनः प्राप्त करने के लिए एक और ऑपरेशन करने की आवश्यकता है ।course
_id
यदि पाठ्यक्रम bio101
को हटा दिया जाता है, तो हमें दस्तावेज़ courses
में फ़ील्ड को अपडेट करने के लिए एक और ऑपरेशन करने की आवश्यकता है student
।
MongoDB की दस्तावेज़-टाइप की गई प्रकृति रिश्तों को परिभाषित करने के लिए लचीले तरीकों का समर्थन करती है। एक-से-कई संबंधों को परिभाषित करने के लिए:
उदाहरण:
student
{
name: 'Kate Monster',
addresses : [
{ street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
{ street: '123 Avenue Q', city: 'New York', cc: 'USA' }
]
}
ऊपर student
/ course
उदाहरण की तरह ।
लॉग-इन संदेशों जैसे वन-टू-स्क्विलेशन के लिए उपयुक्त है।
host
{
_id : ObjectID('AAAB'),
name : 'goofy.example.com',
ipaddr : '127.66.66.66'
}
logmsg
{
time : ISODate("2014-03-28T09:42:41.382Z"),
message : 'cpu is on fire!',
host: ObjectID('AAAB') // Reference to the Host document
}
वस्तुतः, एक host
के माता पिता है logmsg
। host
आईडी को संदर्भित करने से बहुत अधिक जगह बचती है, जो लॉग संदेश स्क्विलेशन हैं।
संदर्भ:
फिर भी जॉन्स का उपयोग करने का एक अन्य विकल्प आपके डेटा को अपकृत करना है। ऐतिहासिक रूप से, प्रदर्शन-संवेदनशील कोड के लिए अपभ्रंश को आरक्षित किया गया था, या जब डेटा को स्नैपशॉट किया जाना चाहिए (जैसे ऑडिट लॉग में)। हालांकि, NoSQL की लगातार बढ़ती लोकप्रियता के साथ, जिनमें से कई में जुड़ाव नहीं है, सामान्य मॉडलिंग के हिस्से के रूप में विकृति तेजी से आम होती जा रही है। इसका मतलब यह नहीं है कि आपको हर दस्तावेज़ में जानकारी के हर टुकड़े की नकल करनी चाहिए। हालांकि, डुप्लिकेट डेटा के डर से अपने डिजाइन निर्णयों को चलाने के बजाय, अपने डेटा को मॉडलिंग करने पर विचार करें कि यह जानकारी किस दस्तावेज़ से संबंधित है।
इसलिए,
student
{
_id: ObjectId(...),
name: 'Jane',
courses: [
{
name: 'Biology 101',
mark: 85,
id:bio101
},
]
}
यदि इसका RESTful API डेटा है, तो पाठ्यक्रम संसाधन के लिए GET लिंक के साथ पाठ्यक्रम आईडी बदलें
फॉरेनके का उद्देश्य डेटा के निर्माण को रोकना है यदि फ़ील्ड मान अपने फॉरेनके से मेल नहीं खाता है। MongoDB में इसे पूरा करने के लिए, हम स्कीमा मध्यवर्तियों का उपयोग करते हैं जो डेटा स्थिरता सुनिश्चित करते हैं।
कृपया दस्तावेज़ पर एक नज़र डालें। https://mongoosejs.com/docs/middleware.html#pre