মঙ্গোডিবি বহু-থেকে-বহু সমিতি


143

আপনি মঙ্গোডিবি-র সাথে কীভাবে একাধিক সংখ্যক সমিতি করবেন?

উদাহরণ স্বরূপ; ধরা যাক আপনার একটি ব্যবহারকারীর টেবিল এবং একটি ভূমিকা সারণী রয়েছে। ব্যবহারকারীদের অনেক ভূমিকা রয়েছে, এবং ভূমিকাগুলির অনেক ব্যবহারকারী রয়েছে। এসকিউএল জমিতে আপনি একটি ইউজাররোলস সারণী তৈরি করবেন।

Users:
    Id
    Name

Roles:
    Id
    Name

UserRoles:
    UserId
    RoleId

মঙ্গোডিবিতে কীভাবে একই ধরণের সম্পর্ক পরিচালিত হয়?


দেখুন এছাড়াও উত্তর এই প্রশ্ন এবং এই প্রশ্নের
ম্যাথু মারডকের

উত্তর:


96

আপনার প্রশ্নের প্রয়োজনের উপর নির্ভর করে আপনি সমস্ত কিছু ব্যবহারকারীর নথিতে রাখতে পারেন:

{name:"Joe"
,roles:["Admin","User","Engineer"]
}

সমস্ত প্রকৌশলী পেতে, ব্যবহার করুন:

db.things.find( { roles : "Engineer" } );

আপনি যদি পৃথক নথিতে ভূমিকাগুলি বজায় রাখতে চান তবে আপনি নামের পরিবর্তে দস্তাবেজের _id ভূমিকাগুলির অ্যারেতে অন্তর্ভুক্ত করতে পারেন:

{name:"Joe"
,roles:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"]
}

এবং ভূমিকাগুলি সেট আপ করুন:

{_id:"6c6793300334001000000006"
,rolename:"Engineer"
}

7
পরবর্তীটি আরও ভাল হবে যেহেতু আমার কাছে সমস্ত উপলব্ধ ভূমিকার একটি তালিকা পাওয়া দরকার। শুধুমাত্র খারাপ অংশটি আমার তখনকার সমিতির উভয় প্রান্তে সেটআপ করা দরকার। এসকিউএল উপায়ে করার সময়, একটি ব্যবহারকারীরোল যুক্ত করা ব্যবহারকারীর ভূমিকা সম্পর্কে এবং ভূমিকাটি ব্যবহারকারীর সম্পর্কে জানতে পারে। এই উপায়টির অর্থ হ'ল আমাকে ব্যবহারকারীকে ভূমিকাটিতে এবং ব্যবহারকারীকে ভূমিকাটিতে সেট করতে হবে। আমার ধারণা এটি ঠিক আছে।
জোশ বন্ধ

46
কোনও ডাটাবেস স্কয়ার সমর্থন করে না তার অর্থ এই নয় যে রেফারেন্সগুলি দরকারী সরঞ্জাম নয় নোএসকিউএল! = NoReferences এই ব্যাখ্যাটি দেখুন: mongodb.org/display/DOCS/Schema+ ডিজাইন
টম গ্রুনার

8
এটি একটি ভাল ধারণা বলে মনে হচ্ছে না। আপনার যদি কেবল ছয়টি ভূমিকা থাকে তবে অবশ্যই, তবে আপনার যদি 20000 টি অবজেক্ট থাকে যা 20000 আরও বেশি অবজেক্টের সাথে সংযুক্ত হতে পারে (বহু সম্পর্কের ক্ষেত্রে)? এমনকি মঙ্গোডিবি ডক্স ইঙ্গিত দেয় যে আপনার পরিবর্তনযোগ্য, প্রচুর পরিমাণে রেফারেন্স থাকা এড়ানো উচিত। docs.mongodb.org/manual/tutorial/…
ক্যাপ্টেনসাল্টিজ্যাক

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

1
এটি বেশিরভাগ সিস্টেমে কাজ করে কোজের ভূমিকা সাধারণত একটি ছোট সেট এবং আমরা সাধারণত একটি ব্যবহারকারীকে নিয়ে যাই এবং তারপরে তার ভূমিকাগুলি দেখি। তবে ভূমিকা বড় হলে কী হবে? বা যদি আমি আপনাকে আমাকে এমন ব্যবহারকারীদের একটি তালিকা দিতে বলি, যার ভূমিকা == "ইঞ্জিনিয়ার"? এখন আপনাকে উদাহরণস্বরূপ এই জাতীয় মিলিয়ন ব্যবহারকারীর মধ্যে এই ভূমিকা থাকতে পারে এমন 2 বা 3 জন ব্যবহারকারী পেতে কেবল আপনার পুরো ব্যবহারকারী সংগ্রহের প্রশ্নটি করতে হবে (যেমন ভূমিকা প্রকৌশলী নেই এমন সমস্ত ব্যবহারকারীদের সাথে দেখা করা)। একটি পৃথক টেবিল বা সংগ্রহ অনেক ভাল।
thepogrammer

31

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

উদাহরণস্বরূপ, "ভূমিকা ব্যবহারকারীদের" ডোমেনের ব্যবহারগুলি অনুসরণ করে:

  1. ভূমিকা - তৈরি করুন, পড়ুন, আপডেট করুন, মুছুন, ব্যবহারকারীদের তালিকা তৈরি করুন, ব্যবহারকারী যুক্ত করুন, ব্যবহারকারীকে সরান, সমস্ত ব্যবহারকারী সাফ করুন, ব্যবহারকারীর সূচি বা অনুরূপ "ইজ ইউজার ইন রোল" সমর্থন করুন (একটি ধারক + এর নিজস্ব মেটাডাটার মতো ক্রিয়াকলাপ)।
  2. ব্যবহারকারী - তৈরি করুন, পড়ুন, আপডেট করুন, মুছুন (সিআরইউডি অপারেশনগুলি একটি মুক্ত-স্থায়ী সত্তার মতো)

এটি নিম্নলিখিত নথি টেম্পলেট হিসাবে মডেল করা যেতে পারে:

User: { _id: UniqueId, name: string, roles: string[] }
    Indexes: unique: [ name ]
Role: { _id: UniqueId, name: string, users: string[] }
    Indexes: unique: [ name ]

উচ্চ ফ্রিকোয়েন্সি ব্যবহারগুলিকে সমর্থন করার জন্য যেমন ব্যবহারকারীর সত্ত্বার ভূমিকা সম্পর্কিত বৈশিষ্ট্য, ব্যবহারকারী। রোলগুলি ইচ্ছাকৃতভাবে অস্বীকৃতিযুক্ত, ব্যবহারকারীর পাশাপাশি রোল le ব্যবহারকারীদের সদৃশ স্টোরেজ রয়েছে।

যদি এটি পাঠ্যটিতে সহজেই আপাত না হয় তবে ডকুমেন্টের সংগ্রহস্থল ব্যবহার করার সময় এই ধরনের চিন্তাভাবনা উত্সাহিত হয়।

আমি আশা করি এটি অপারেশনগুলির পড়ার দিকটি বিবেচনা করে ফাঁকটি পূরণ করতে সহায়তা করে।

লেখার পক্ষের জন্য, যা উত্সাহিত করা হয় তা হল পারমাণবিক লেখাগুলি অনুসারে মডেল করা। উদাহরণস্বরূপ, যদি নথির কাঠামোগুলিতে কোনও লক অর্জন করা প্রয়োজন হয়, একটি নথি আপডেট করা হয়, তারপরে আরেকটি এবং সম্ভবত আরও নথি থাকে, তবে লকটি মুক্তি দেয়, সম্ভবত মডেলটি ব্যর্থ হয়েছে। কেবলমাত্র আমরা বিতরণ লকগুলি তৈরি করতে পারার অর্থ এই নয় যে আমাদের সেগুলি ব্যবহার করার কথা।

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

আমাদের অণু রচনাগুলি লকগুলি রোধ করতে প্রকৃতপক্ষে প্রসারিত ক্রিয়াকলাপটি একটি ভূমিকা সাফ করছে, যার ফলে ব্যবহারকারী.রোলে অ্যারে থেকে রোল নামটি মুছে ফেলার ফলে অনেকগুলি ব্যবহারকারী আপডেট হতে পারে। তত্কালীন এই অপারেশনটি সাধারণত নিরুৎসাহিত করা হয়, তবে প্রয়োজনে অপারেশনগুলি অর্ডার দিয়ে প্রয়োগ করা যেতে পারে:

  1. Role.users থেকে ব্যবহারকারীর নামের তালিকা পান।
  2. পদক্ষেপ 1 থেকে ব্যবহারকারীর নামগুলি সনাক্ত করুন, ব্যবহারকারীর ভূমিকা থেকে নামটি সরান।
  3. ভূমিকা.Ursrs সাফ করুন।

ধাপ ২-এর মধ্যে সবচেয়ে বেশি দেখা যায় এমন কোনও সমস্যার ক্ষেত্রে, পদক্ষেপ 1 থেকে ব্যবহারকারী নামের একই সেটটি পুনরুদ্ধার বা চালিয়ে যাওয়ার জন্য ব্যবহার করা যেতে পারে বলে একটি রোলব্যাক সহজ।


15

আমি এই প্রশ্নটি নিয়ে হোঁচট খেয়েছি এবং, যদিও এটি পুরানো, তবে আমি ভেবেছিলাম যে উত্তরগুলি দেওয়া হয়নি তার কয়েকটি উল্লেখ করা সম্ভব হবে। এছাড়াও, গত কয়েক বছরে জিনিসগুলি কিছুটা এগিয়ে গেছে, সুতরাং এসকিউএল এবং নোএসকিউএল একে অপরের কাছাকাছি চলেছে তা জোর দেওয়া উচিত।

একজন মন্তব্যকারী বুদ্ধিমান সাবধানতা অবলম্বন করেছিলেন যে "যদি ডেটা রিলেশনাল হয়, রিলেশনাল ব্যবহার করুন"। তবে, সেই মন্তব্যটি কেবলমাত্র সম্পর্কের বিশ্বেই অর্থবোধ করে, যেখানে স্কিমার সবসময় প্রয়োগের আগে আসে।

সম্পর্কিত ওয়ার্ল্ড: স্ট্রাকচার ডেটা> অ্যাপ্লিকেশন লিখুন এটি পেতে
নসকিউএল ওয়ার্ল্ড: ডিজাইন অ্যাপ্লিকেশন> সেই অনুযায়ী স্ট্রাকচার ডেটা

এমনকি যদি ডেটা আপেক্ষিক হয় তবে নোএসকিউএল এখনও একটি বিকল্প। উদাহরণস্বরূপ, একের সাথে একাধিক সম্পর্ক কোনও সমস্যা নয় এবং এটি মঙ্গোডিবি ডক্সে বিস্তৃত

২০১০ সালের সমস্যা সমাধানের জন্য ২০১৫ সালের সমাধান

যেহেতু এই প্রশ্নটি পোস্ট করা হয়েছিল, নো এসকিউএল এসকিউএল এর আরও কাছে আনার জন্য গুরুতর প্রচেষ্টা হয়েছে। ক্যালিফোর্নিয়া বিশ্ববিদ্যালয়ের (সান দিয়েগো) ইয়ান্নিস পাপাকনস্টান্টিনোর নেতৃত্বাধীন দলটি ফরওয়ার্ডে কাজ করছে , এসকিউএল ++ এর একটি বাস্তবায়ন যা শীঘ্রই এখানে পোস্ট করা দলের মতো অবিরাম সমস্যার সমাধান হতে পারে।

আরও ব্যবহারিক স্তরে, কাউচবেস ৪.০ প্রকাশের অর্থ হল প্রথমবারের মতো আপনি নোএসকিউএল-এ দেশীয় যোগদান করতে পারেন। তারা তাদের নিজস্ব এন 1কিউএল ব্যবহার করে। এটি JOINতাদের টিউটোরিয়ালের একটি উদাহরণ :

SELECT usr.personal_details, orders 
        FROM users_with_orders usr 
            USE KEYS "Elinor_33313792" 
                JOIN orders_with_users orders 
                    ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END

এন 1কিউএল একত্রীকরণ, ফিল্টারিং ইত্যাদিসহ সমস্ত এসকিউএল অপারেশন না হলে বেশিরভাগের জন্য অনুমতি দেয়

না-নতুন-হাইব্রিড সলিউশন

যদি মঙ্গোডিবি এখনও একমাত্র বিকল্প হয় তবে আমি আমার বক্তব্যটিতে ফিরে যেতে চাই যে অ্যাপ্লিকেশনটি ডেটার কাঠামোর চেয়ে বেশি প্রাধান্য পাবে। উত্তরের কোনওটিতেই হাইব্রিড এম্বেডিংয়ের উল্লেখ নেই, যার মাধ্যমে সর্বাধিক জিজ্ঞাসিত ডেটা নথি / বস্তুটিতে এম্বেড করা হয় এবং সংখ্যালঘু ক্ষেত্রে রেফারেন্স রাখা হয়।

উদাহরণ: তথ্য (ভূমিকা নাম ব্যতীত) অপেক্ষা করতে পারেন? ব্যবহারকারীর এখনও প্রয়োজন নেই এমন কোনও কিছুর অনুরোধ না করে অ্যাপ্লিকেশনটি বুটস্ট্র্যাপিং দ্রুত হতে পারে?

এটি ক্ষেত্রে হতে পারে যদি ব্যবহারকারী লগ ইন করে এবং s / তার নিজের সমস্ত ভূমিকার জন্য সমস্ত বিকল্প দেখতে হয়। তবে, ব্যবহারকারী একজন "ইঞ্জিনিয়ার" এবং এই ভূমিকার জন্য বিকল্পগুলি খুব কমই ব্যবহৃত হয়। এর অর্থ হ'ল অ্যাপ্লিকেশনটিতে কেবল ইঞ্জিনিয়ারের জন্য অপশনগুলি দেখাতে হবে যদি সে সেগুলিতে ক্লিক করতে চায়।

এটি এমন একটি দস্তাবেজের মাধ্যমে অর্জন করা যায় যা শুরুতে অ্যাপ্লিকেশনটিকে বলে (1) যা ব্যবহারকারীর ভূমিকা পালন করে এবং (2) কোন নির্দিষ্ট ভূমিকার সাথে লিঙ্কিত কোনও ইভেন্ট সম্পর্কে তথ্য পেতে পারে।

   {_id: ObjectID(),
    roles: [[“Engineer”, ObjectId()”],
            [“Administrator”, ObjectId()”]]
   }

বা আরও ভাল, ভূমিকাগুলির ভূমিকা.Name ক্ষেত্রটি সূচী করুন এবং আপনারও অবজেক্টআইডি () এম্বেড করার প্রয়োজন হতে পারে না।

আরেকটি উদাহরণ: সমস্ত ভূমিকা সম্পর্কে সমস্ত সময় অনুরোধ করা তথ্যগুলি কি?

এটি এমন ক্ষেত্রেও হতে পারে যে ব্যবহারকারী ড্যাশবোর্ডে লগ ইন করে এবং 90% সময় "ইঞ্জিনিয়ার" ভূমিকার সাথে লিঙ্কিত কাজগুলি সম্পাদন করে। হাইব্রিড এম্বেডিং সম্পূর্ণভাবে সেই বিশেষ ভূমিকার জন্য এবং কেবল বাকীগুলির জন্য রেফারেন্স রাখতে পারে keep

{_id: ObjectID(),
  roles: [{name: Engineer”, 
           property1: value1,
           property2: value2
          },   
          [“Administrator”, ObjectId()”]
         ]
}

স্কিমহীন হওয়া কেবল নোএসকিউএল এর একটি বৈশিষ্ট্য নয়, এই ক্ষেত্রে এটি একটি সুবিধা হতে পারে। এটি কোনও ব্যবহারকারীর অবজেক্টের "ভূমিকা" বৈশিষ্ট্যে বিভিন্ন ধরণের অবজেক্টগুলিকে বাসা বাঁধার জন্য পুরোপুরি বৈধ।


5

ক্ষেত্রে যখন কর্মচারী এবং সংস্থা সত্তা-অবজেক্ট হয় নিম্নলিখিত স্কিমা ব্যবহার করার চেষ্টা করুন:

employee{
   //put your contract to employee
   contracts:{ item1, item2, item3,...}
}

company{
   //and duplicate it in company
   contracts:{ item1, item2, item3,...}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.