মোংগোতে বিদেশী চাবি?


99

এখানে চিত্র বর্ণনা লিখুন

আমি মঙ্গোডিবিতে এই জাতীয় কোনও পরিকল্পনা কীভাবে ডিজাইন করব? আমার মনে হয় কোনও বিদেশী চাবি নেই!


10
আপনি নথিভিত্তিক নয়, বরং সম্পর্কযুক্ত চিন্তা করছেন relation : পি
প্যাট

6
আপনি যদি কোনও রিলেশনাল ডাটাবেস চান তবে আপনি কেন মংগোডিবি ব্যবহার করছেন?
অ্যাডাম রবিনসন

50
: ডি আমি নথিভিত্তিক পদ্ধতিটি বোঝার চেষ্টা করছি; আমি এই কাজটি কীভাবে সমাধান করতে পারি?
মার্ক পেগাসভ

আপনি যদি নথির ওরিয়েন্টেড চিন্তাভাবনার উত্তর চান তবে stackoverflow.com/a/18637581/80428 দেখুন । বর্তমান গৃহীত উত্তরটি কাজ করে তবে কোনও ডকুমেন্ট স্টোরের সাথে সম্পর্কযুক্ত ডেটাবেসকে শুভহর্নিং করে যা নোএসকিউএল সম্পর্কে নয়।
জে

উত্তর:


27

আপনি মংগয়েড বা মঙ্গোমাপ্পারের মতো কোনও ওআরএম ব্যবহারে আগ্রহী হতে পারেন।

http://mongoid.org/docs/references/referencesd/1-n.html

মঙ্গোডিবি-র মতো কোনও নোএসকিউএল ডাটাবেসে 'টেবিল' নয় তবে সংগ্রহ রয়েছে। সংগ্রহগুলির মধ্যে নথিগুলি গোষ্ঠীভুক্ত করা হয়। একক সংকলনে আপনার যে কোনও ধরনের নথি থাকতে পারে - যে কোনও ধরনের ডেটা সহ with মূলত, কোনও নোএসকিউএল ডাটাবেজে আপনার যদি কোনও তথ্য থাকে তবে কীভাবে ডেটা এবং তার সম্পর্কগুলি সংগঠিত করবেন তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে।

মংগয়েড এবং মঙ্গোমাপার যা করেন তা হ'ল আপনাকে সহজেই সম্পর্ক স্থাপনের জন্য সুবিধাজনক পদ্ধতিগুলি সরবরাহ করা। আমি আপনাকে দেওয়া লিঙ্কটি দেখুন এবং যেকোন কিছু জিজ্ঞাসা করুন।

সম্পাদনা করুন:

মঙ্গয়েডে আপনি আপনার স্কিমটি এভাবে লিখবেন:

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" }

নথিগুলির মধ্যে সম্পর্ক স্থাপনের জন্য আপনি সেই অবজেক্টআইড ব্যবহার করতে পারেন।


আইটেম সহ নথি আছে, এবং আমি শহরগুলি বাঁধতে চাই। আমি শহরগুলির সাথে সংগ্রহ তৈরি করেছি, তবে কীভাবে শহরগুলি আইটেমগুলির সাথে আবদ্ধ করতে হয় তা আমি জানি না। আমার খারাপ ইংরেজির জন্য পিএস দুঃখিত।
মার্ক পেগাসভ

ইউপিডি। আমি পিএইচপি একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে ব্যবহার করছি, এটি রুবিতে লেখা থাকলে আমি কীভাবে মঙ্গয়েড ব্যবহার করতে পারি?
মার্ক পেগাসভ

4
@ Жирайр Казаросян: ওহ আমি দেখছি :) রুবি বিকাশকারী হওয়া আমাকে কেবল রুবির মধ্যেই ভাবতে বাধ্য করে :) আমি ভয় করি যে আমার পিএইচপি এবং মঙ্গোর
নেরিয়ান

4
@ Жирайр Казаросян: বাস্তববাদী প্রোগ্রামারদের দ্বারা আমি রুবিকে অন রেলস উইন্ডো রেল উইথ রেল উইন্ডোজ রেল বইটি শিখেছি। আপনি এই স্ক্রিনকাস্ট কোডসুলভ.কমার্স
ক্রেইসস /

4
পরবর্তী পাঠকদের জন্য, "সারণীগুলি" মঙ্গোডিবিতে "সংগ্রহ"। সারি হ'ল ডকুমেন্টস এবং কলামগুলি ক্ষেত্রগুলি ... ঠিক যদি আপনি মিশ্রিত হন।
সিপিইউ_মেলটাটাউন

65

মংডোবিতে এই জাতীয় টেবিল কীভাবে ডিজাইন করবেন?

প্রথমে কিছু নামকরণের সম্মেলন পরিষ্কার করতে। এর collectionsপরিবর্তে মঙ্গোডিবি ব্যবহার করে 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'
}

স্পষ্টতই জেনের কোর্সের তালিকাটি নির্দিষ্ট কিছু কোর্সের দিকে নির্দেশ করে। ডাটাবেস সিস্টেমে কোনও বাধা প্রয়োগ করে না ( যেমন: বিদেশী কী বাধা ), তাই কোনও "ক্যাসকেডিং মোছা" বা "ক্যাসকেডিং আপডেট" নেই। তবে, ডাটাবেসটিতে সঠিক তথ্য রয়েছে does

তদ্ব্যতীত , মঙ্গোডিবির একটি ডিবিআরএফ স্ট্যান্ডার্ড রয়েছে যা এই উল্লেখগুলি তৈরির মানকে সহায়তা করতে সহায়তা করে। আসলে, আপনি যদি সেই লিঙ্কটি একবার দেখুন, এটির একটি অনুরূপ উদাহরণ রয়েছে।

আমি এই কাজটি কীভাবে সমাধান করতে পারি?

পরিষ্কারভাবে বলতে গেলে, মঙ্গোডিবি সম্পর্কযুক্ত নয়। কোনও স্ট্যান্ডার্ড "নরমাল ফর্ম" নেই। আপনার সঞ্চয় করা ডেটা এবং আপনার চালনার ইচ্ছা অনুসারে থাকা প্রশ্নের জন্য আপনার আপনার ডাটাবেসটি উপযুক্ত করা উচিত।


4
ঠিক আছে, তবে আমি কীভাবে ছাত্র সংগ্রহ থেকে স্রোসের নাম ডেটা পেতে পারি? db.student.find () কোর্সের মতো কিছু ফেরত পাঠাবে: [{অবশ্যই: 'bio101', চিহ্ন: 85}]
মার্ক পেগাসভ

@ Жирайр Казаросян:> db.foo.find ({'_ id': অবজেক্টআইড ("4df6539ae90592692ccc9940")}) -------------> {"_id": অবজেক্টআইড ("4df6539ae90592692ccc9940"), "গোষ্ঠী": "ফোনগুলি"}
নেরিয়ান

ডিবিআরইএফ সম্পর্কে মঙ্গো ডক থেকে: "আপনি যদি ডিবিআরএফ ব্যবহারের জন্য বাধ্যতামূলক কারণ না পান তবে পরিবর্তে ম্যানুয়াল রেফারেন্স ব্যবহার করুন" "
kroiz

23

আমরা foreign keyমঙ্গোডিবি -তে তথাকথিত সংজ্ঞা দিতে পারি । তবে আমাদের নিজের দ্বারা ডেটা অখণ্ডতা বজায় রাখা দরকার । উদাহরণ স্বরূপ,

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

আরও: মঙ্গোডিবি স্কিমা ডিজাইন

মংগোডিবি-র নথি-টাইপিত প্রকৃতি সম্পর্কের সংজ্ঞা দেওয়ার নমনীয় উপায়গুলিকে সমর্থন করে। একের মধ্যে একাধিক সম্পর্কের সংজ্ঞা দিতে:

এম্বেড করা দস্তাবেজ

  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. মঙ্গোডিবি স্কিমা ডিজাইনের জন্য থাম্বের 6 টি বিধি: পর্ব 1
  2. মংগোডিবি স্কিমা ডিজাইনের জন্য থাম্বের 6 বিধি: পার্ট 2
  3. মঙ্গোডিবি স্কিমা ডিজাইনের জন্য থাম্বের 6 বিধি: পার্ট 3
  4. নথি রেফারেন্স সহ একাধিক সম্পর্ক মডেল

19

থেকে লিটল MongoDB বুক

যোগদানের সাথে যুক্ত হওয়ার আরেকটি বিকল্প হ'ল আপনার ডেটাটিকে ডেনরমালাইজ করা। Icallyতিহাসিকভাবে, ডেনরমালাইজেশন কার্য সম্পাদন-সংবেদনশীল কোডের জন্য সংরক্ষণ করা হয়েছিল, বা যখন ডেটা স্ন্যাপশট করা উচিত (অডিট লগের মতো)। যাইহোক, নোএসকিউএল-এর ক্রমবর্ধমান জনপ্রিয়তার সাথে, যার মধ্যে বেশিরভাগই যোগ দেয় না, সাধারণ মডেলিংয়ের অংশ হিসাবে অস্বীকৃতি ক্রমশই সাধারণ হয়ে উঠছে। এর অর্থ এই নয় যে আপনার প্রত্যেক নথিতে প্রতিটি টুকরো তথ্য নকল করা উচিত। যাইহোক, সদৃশ ডেটা আপনার নকশার সিদ্ধান্তগুলিকে চালিত করার পরিবর্তে কোন তথ্যটি কী ডকুমেন্টের সাথে সম্পর্কিত তার ভিত্তিতে আপনার ডেটা মডেলিংয়ের বিষয়টি বিবেচনা করুন।

সুতরাং,

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

যদি এটি একটি রেস্টলফুল এপিআই ডেটা হয় তবে কোর্স আইডিকে কোর্স রিসোর্সের জিইটি লিঙ্কের সাথে প্রতিস্থাপন করুন


আমি মনে করি এটি সঠিক উত্তর। আপনি যদি মঙ্গোতে সম্পর্কিত তথ্য সংরক্ষণ না করেন তবে আপনি কেন মঙ্গো ব্যবহার করছেন তা আপনার সত্যই প্রশ্ন করা উচিত ছিল ।
জে

0

ফরেনকির উদ্দেশ্য হ'ল যদি ক্ষেত্রের মানটি তার বিদেশের সাথে মেলে না তবে ডেটা তৈরি করা রোধ করা। মঙ্গোডিবিতে এটি সম্পাদন করার জন্য, আমরা স্কিমা মিডলওয়্যারগুলি ব্যবহার করি যা ডেটা ধারাবাহিকতা নিশ্চিত করে।

ডকুমেন্টেশন একবার দেখুন। https://mongoosejs.com/docs/middleware.html#pre

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.