मोंगो में विदेशी कुंजी?


94

यहां छवि विवरण दर्ज करें

मैं इस तरह की योजना MongoDB में कैसे तैयार करूं? मुझे लगता है कि कोई विदेशी कुंजी नहीं है!


9
दस्तावेज़-उन्मुख के बजाय आप मज़बूती से सोच रहे हैं। : पी
पाट

6
यदि आप रिलेशनल डेटाबेस चाहते हैं तो आप MongoDB का उपयोग क्यों कर रहे हैं?
एडम रॉबिन्सन

47
: D मैं दस्तावेज़-उन्मुख पद्धति को समझने की कोशिश कर रहा हूं; मैं इस कार्य को कैसे हल कर सकता हूं?
मार्क पेगासोव

यदि आप सोच के दस्तावेज़ उन्मुख तरीके का जवाब चाहते हैं तो stackoverflow.com/a/18637581/80428 देखें । वर्तमान स्वीकृत उत्तर काम करता है, लेकिन एक दस्तावेज़ स्टोर के लिए संबंध डेटाबेस है जो NoSQL के बारे में नहीं है।
जय विक

जवाबों:


27

आप 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 का उपयोग कर सकते हैं।


वस्तुओं के साथ दस्तावेज हैं, और मैं शहरों को बांधना चाहता हूं। मैंने शहरों के साथ संग्रह बनाया है, लेकिन मुझे नहीं पता कि शहरों को वस्तुओं के साथ कैसे जोड़ा जाए। PS मेरी खराब अंग्रेजी के लिए खेद है।
मार्क पेगासोव

युपीडी। मैं एक प्रोग्रामिंग भाषा के रूप में PHP का उपयोग कर रहा हूं, अगर मैं रूबी में लिखा हूं, तो मैं मूंगॉयड का उपयोग कैसे कर सकता हूं?
मार्क पेगासोव

1
@ Яирайр Казаросян: ओह मैं देख रहा हूँ :) एक रूबी डेवलपर होने के नाते मुझे केवल रूबी में लगता है :) मुझे डर है कि मुझे PHP और मोंगो के साथ अनुभव नहीं है, लेकिन आप इस लिंक की जांच कर सकते हैं: mongbb.org/display/DOCS/ …
नेरियन

1
@ Яирайр Казаросян: मैंने रूबी पर रूबी के साथ पुस्तक वेब विकास के साथ व्यावहारिक प्रोग्रामर द्वारा रूबी सीखा। आप भी इस स्क्रीनकास्ट साथ मुक्त करने के लिए एक परिचय प्राप्त कर सकते हैं codeschool.com/courses/rails-for-zombies
Nerian

2
बाद के पाठकों के लिए, "टेबल" MongoDB में "संग्रह" हैं। पंक्तियाँ दस्तावेज़ हैं, और स्तंभ फ़ील्ड हैं ... बस मामले में आप मिश्रित हो जाते हैं।
cpu_meltdown

64

मोंगोडब में इस तरह से टेबल कैसे डिज़ाइन करें?

सबसे पहले, कुछ नामकरण सम्मेलनों को स्पष्ट करने के लिए। 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 संबंधपरक नहीं है। कोई मानक "सामान्य रूप" नहीं है। आपको अपना डेटाबेस आपके द्वारा संग्रहीत डेटा और आपके द्वारा चलाए जाने वाले प्रश्नों के लिए उपयुक्त होना चाहिए।


2
ठीक है, लेकिन छात्र संग्रह से मुझे नाम कैसे मिल सकता है? db.student.find () पाठ्यक्रमों की तरह कुछ लौटाएगा: [{कोर्स: 'बायो101', मार्क: 85}]
मार्क पेगासोव

@ Яирайр Казаросян:> db.foo.find ({'_ आईडी': ObjectId ("4df6539ae90592692ccc9940")}) ------------> {"_id": ObjectId ("4df6539ae90592692ccc9940)" "समूह": "फोन"}
नेरियन

डीबीआरईएफ के बारे में मोंगो डॉक से: "जब तक आपके पास डीबीआरईएफ का उपयोग करने के लिए एक सम्मोहक कारण है, इसके बजाय मैनुअल उपयोग करें।"
kroiz

22

हम foreign keyMongoDB में तथाकथित परिभाषित कर सकते हैं । हालांकि, हम डेटा अखंडता को बनाए रखने की जरूरत है अपने आप से । उदाहरण के लिए,

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 स्कीमा डिज़ाइन

MongoDB की दस्तावेज़-टाइप की गई प्रकृति रिश्तों को परिभाषित करने के लिए लचीले तरीकों का समर्थन करती है। एक-से-कई संबंधों को परिभाषित करने के लिए:

एंबेडेड दस्तावेज़

  1. एक-से-कुछ के लिए उपयुक्त।
  2. लाभ: किसी अन्य दस्तावेज़ में अतिरिक्त प्रश्न करने की आवश्यकता नहीं है।
  3. नुकसान: व्यक्तिगत रूप से एम्बेडेड दस्तावेजों की इकाई का प्रबंधन नहीं कर सकते।

उदाहरण:

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के माता पिता है logmsghostआईडी को संदर्भित करने से बहुत अधिक जगह बचती है, जो लॉग संदेश स्क्विलेशन हैं।

संदर्भ:

  1. MongoDB स्कीमा डिजाइन के लिए अंगूठे के 6 नियम: भाग 1
  2. MongoDB स्कीमा डिजाइन के लिए अंगूठे के 6 नियम: भाग 2
  3. MongoDB स्कीमा डिजाइन के लिए अंगूठे के 6 नियम: भाग 3
  4. दस्तावेज़ संदर्भों के साथ मॉडल एक से कई संबंध

19

से लिटिल MongoDB बुक

फिर भी जॉन्स का उपयोग करने का एक अन्य विकल्प आपके डेटा को अपकृत करना है। ऐतिहासिक रूप से, प्रदर्शन-संवेदनशील कोड के लिए अपभ्रंश को आरक्षित किया गया था, या जब डेटा को स्नैपशॉट किया जाना चाहिए (जैसे ऑडिट लॉग में)। हालांकि, NoSQL की लगातार बढ़ती लोकप्रियता के साथ, जिनमें से कई में जुड़ाव नहीं है, सामान्य मॉडलिंग के हिस्से के रूप में विकृति तेजी से आम होती जा रही है। इसका मतलब यह नहीं है कि आपको हर दस्तावेज़ में जानकारी के हर टुकड़े की नकल करनी चाहिए। हालांकि, डुप्लिकेट डेटा के डर से अपने डिजाइन निर्णयों को चलाने के बजाय, अपने डेटा को मॉडलिंग करने पर विचार करें कि यह जानकारी किस दस्तावेज़ से संबंधित है।

इसलिए,

student
{ 
    _id: ObjectId(...),
    name: 'Jane',
    courses: [
    { 
        name: 'Biology 101', 
        mark: 85, 
        id:bio101 
    },
  ]
}

यदि इसका RESTful API डेटा है, तो पाठ्यक्रम संसाधन के लिए GET लिंक के साथ पाठ्यक्रम आईडी बदलें


मुझे लगता है कि यह सही उत्तर है। जब तक आप मूंगो में संबंधपरक डेटा संग्रहीत नहीं कर रहे हैं, उस स्थिति में, आपको वास्तव में सवाल करना चाहिए कि आप मोंगो का उपयोग क्यों कर रहे हैं।
जय विक

0

फॉरेनके का उद्देश्य डेटा के निर्माण को रोकना है यदि फ़ील्ड मान अपने फॉरेनके से मेल नहीं खाता है। MongoDB में इसे पूरा करने के लिए, हम स्कीमा मध्यवर्तियों का उपयोग करते हैं जो डेटा स्थिरता सुनिश्चित करते हैं।

कृपया दस्तावेज़ पर एक नज़र डालें। https://mongoosejs.com/docs/middleware.html#pre

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.