আপনি কীভাবে নোএসকিউএলে রেকর্ড সম্পর্কগুলি ট্র্যাক করবেন?


117

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

বলুন আমার একজন ব্যবহারকারী আছে এবং এই ব্যবহারকারীর সাইটে অনেক মন্তব্য রয়েছে। ব্যবহারকারীদের মন্তব্যগুলির উপর নজর রাখা কেবলমাত্র উপায় keep

  1. তাদের ব্যবহারকারীর অবজেক্টে এম্বেড করুন (যা বেশ কার্যকর নয়)
  2. user_id:commentsপ্রতিটি মন্তব্যের কীগুলির একটি তালিকা রয়েছে এমন একটি মান তৈরি এবং বজায় রাখুন [মন্তব্য: 34, মন্তব্য: 197, ইত্যাদি ...] যাতে আমি প্রয়োজন হিসাবে তাদের এনে দিতে পারি।

যাইহোক, দ্বিতীয় উদাহরণটি গ্রহণ করার পরে আপনি শীঘ্রই একটি ইটের প্রাচীরের উপর আঘাত হানবেন যখন আপনি "সক্রিয়_কমেন্টস" নামে একটি কী হিসাবে অন্যান্য জিনিসগুলি ট্র্যাক করার জন্য এটি ব্যবহার করেন যার মধ্যে এতে 30 মিলিয়ন আইডি থাকতে পারে যা কিছু পৃষ্ঠার সন্ধানের জন্য টোন ব্যয় করে কেবল কিছু সাম্প্রতিক জানতে সক্রিয় মন্তব্যসমূহ। এটি জাতি-শর্তগুলির জন্য খুব প্রবণ হবে কারণ অনেক পৃষ্ঠা একই সাথে এটি আপডেট করার চেষ্টা করতে পারে।

আমি কোনও নোএসকিউএল ডাটাবেসে নীচের মতো সম্পর্কগুলি কীভাবে ট্র্যাক করতে পারি?

  • একটি ব্যবহারকারীর সব মন্তব্য
  • সমস্ত সক্রিয় মন্তব্য
  • সমস্ত পোস্ট [ট্যাগ] সাথে ট্যাগ
  • কোনও ক্লাবের সমস্ত ছাত্র - বা সমস্ত ক্লাবের একজন শিক্ষার্থী

না আমি এই সম্পর্কে ভুলভাবে চিন্তা করছি?


নোএসকিউএল ডাটাবেসে এটি করার কোনও উপায় নেই, এই প্রশ্নটি বরং সি প্রোগ্রামগুলিতে আমি সম্পর্কগুলি কীভাবে ট্র্যাক করব তা জিজ্ঞাসা করার জন্য এটি একটি আত্মীয়।
স্টোনমেটাল

3
বাহ, তখন আমি অনুমান করি যে আরডিবিএমএস প্রতিস্থাপন নোএসকিউএল সম্পর্কে হাইপ অসম্ভব।
জিওনক্রস

11
হ্যাঁ, নোএসকিউএল অবশ্যই স্পষ্টভাবে ছাপিয়ে গেছে। আমি বলছি না যে নতুন প্রযুক্তিগুলি সঠিক পরিস্থিতিতে কার্যকর নয়, তবে তারা আরডিবিএমএসকে প্রতিস্থাপন করবে তা ভেবে হাস্যকর। En.wikedia.org/wiki/Hype_cycle
বিল কারভিন

1
আপনার কি কেবল 'ব্যবহারকারীদের' সংগ্রহ এবং মন্তব্যের সংগ্রহ নেই? এবং তারপরে, প্রতিটি মন্তব্য কেবল একজন 'লেখক' সম্পত্তি হিসাবে যার মানটি কোনও আইডি-তে ফিরে আসে?
কোডফিনিটি

উত্তর:


186

"নোএসকিউএল উপায়ে" বহু-থেকে-বহু সংস্থান কীভাবে সংরক্ষণ করবেন তার সমস্ত উত্তর একই জিনিস হ্রাস করতে পারে: অতিরিক্তভাবে ডেটা সঞ্চয় করে।

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

তবে এটি অনিবার্যভাবে এক প্রকারের ক্যোয়ারির (যেমন কোনও ব্যবহারকারীর দ্বারা প্রদত্ত নিবন্ধের জন্য মন্তব্য) অন্যান্য ধরণের প্রশ্নের ব্যয় করে (প্রদত্ত ব্যবহারকারীর কোনও নিবন্ধের জন্য মন্তব্য) উপযুক্ত করে। যদি আপনার অ্যাপ্লিকেশনটিতে উভয় ধরণের প্রশ্নের সমানভাবে অনুকূলিতকরণের প্রয়োজন হয় তবে আপনার অস্বীকার করা উচিত নয়। এবং তেমনি, আপনার যদি কোনও সম্পর্কযুক্ত উপায়ে ডেটা ব্যবহার করার প্রয়োজন হয় তবে আপনার কোনও নোএসকিউএল সমাধান ব্যবহার করা উচিত নয়।

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

কেউ ভাবতে পারেন যে কোনও নোএসকিউএল ডাটাবেসের পক্ষে আপনার জন্য অনিয়ম প্রতিরোধের কঠোর পরিশ্রম করা ভাল। এটি করতে পারে এমন একটি দৃষ্টান্ত রয়েছে - রিলেশনাল দৃষ্টান্ত।


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

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

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

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

2
একটি অস্বীকৃত রিলেশনাল ডাটাবেসের ক্ষেত্রে একই সমস্যা বিদ্যমান ।
বিল কারভিন

5

কাউচডিবি পদ্ধতির মানচিত্রের পর্যায়ে স্টাফগুলির যথাযথ শ্রেণি নির্গমনের এবং এটি হ্রাসের সংক্ষিপ্তকরণের পরামর্শ দেওয়া হয়েছে .. সুতরাং আপনি সমস্ত মন্তব্য ম্যাপ করতে এবং 1প্রদত্ত ব্যবহারকারীর জন্য নির্গত করতে এবং পরে কেবলমাত্র মুদ্রণ করতে পারবেন। কাউচডিবিতে সমস্ত ট্র্যাকযোগ্য ডেটার ধ্রুবক দৃষ্টিভঙ্গি তৈরি করতে তবে প্রচুর ডিস্ক স্টোরেজ প্রয়োজন। বিটিডব্লিউ সম্পর্কের বিষয়ে তাদের এই উইকি পৃষ্ঠা রয়েছে: http://wiki.apache.org/couchdb/EntityReferenceship

অন্যদিকে রিয়াকের মধ্যে সম্পর্ক তৈরির সরঞ্জাম রয়েছে। এটি লিঙ্ক। আপনি 'মূল' নথিতে কোনও লিঙ্কযুক্ত (এখানে মন্তব্য) নথির ঠিকানা ইনপুট করতে পারেন (এখানে ব্যবহারকারী নথিতে)। এটি একটি কৌশল আছে। যদি এটি বিতরণ করা হয় তবে এটি একসাথে অনেক জায়গায় পরিবর্তিত হতে পারে। এটি দ্বন্দ্ব সৃষ্টি করবে এবং ফলস্বরূপ বিশাল ভেক্টর ক্লক ট্রি: / .. এত খারাপ নয়, এত ভাল নয়।

রিয়াকের আরও একটি 'মেকানিজম' রয়েছে। এটিতে 2-স্তর কী নামের স্থান রয়েছে, তাই বলে বালতি এবং কী। সুতরাং, শিক্ষার্থীর উদাহরণস্বরূপ, যদি আমাদের ক্লাব এ, বি এবং সি এবং শিক্ষার্থী স্টুডেন্টএক্স থাকে তবে শিক্ষার্থীওয়ালা নিম্নলিখিত সম্মেলনটি বজায় রাখতে পারবেন:

{ Key = {ClubA, StudentX}, Value = true }, 
{ Key = {ClubB, StudentX}, Value = true }, 
{ Key = {ClubA, StudentY}, Value = true }

এবং প্রদত্ত বালতিতে কেবল তালিকার চাবিগুলি সম্পর্কিত পড়তে। তাতে কী ভুল? এটা ধীর। তালের তালিকাগুলি কখনও অগ্রগতির পক্ষে ছিল না। এটি আরও ভাল এবং আরও ভাল হচ্ছে। BTW। আপনি স্মৃতি নষ্ট করবেন না কারণ এই উদাহরণটি {true}স্টুডেন্টএক্স বা ওয়াইয়ের একক সম্পূর্ণ প্রোফাইলের সাথে লিঙ্ক করা যেতে পারে (এখানে বিরোধগুলি সম্ভব নয়)।

আপনি এটি দেখতে NoSQL! = NoSQL। আপনার নিজের জন্য নির্দিষ্ট প্রয়োগটি দেখতে হবে এবং এটি পরীক্ষা করতে হবে।

সম্পর্কের জন্য কলাম স্টোরগুলি দেখতে উপযুক্ত ফিট হওয়ার আগে উল্লেখ করা হয়েছে .. তবে এটি সমস্ত আপনার A এবং C এবং P প্রয়োজনীয়তার উপর নির্ভর করে;) যদি আপনার A এর প্রয়োজন না হয় এবং পেটা বাইটের চেয়ে কম থাকে তবে এটি মাইএসকিএল বা পোস্টগ্রিসের সাথে এগিয়ে যান।

শুভকামনা


1
রিয়াক সম্প্রতি ভি 1.0 প্রকাশ করেছে, যা লেভেলডিবি ব্যাকএন্ড ব্যবহার করার সময় গৌণ সূচকের জন্য সমর্থন যুক্ত করে। খুব মূল্যবান বৈশিষ্ট্য।
জন এল।

4
  1. ব্যবহারকারী: ব্যবহারকারী: মন্তব্যগুলি একটি যুক্তিসঙ্গত পন্থা - এসকিউএল-তে একটি কলাম সূচকের সমতুল্য হিসাবে এটি ভাবেন, এমন অতিরিক্ত প্রয়োজনীয়তা সহ যা আপনি আন-ইনডেক্সড কলামগুলিতে জিজ্ঞাসা করতে পারবেন না।

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

  3. ব্যবহারকারীর মতামত হিসাবে একই - একটি সূচক কীওয়ার্ড তৈরি করুন: পোস্ট

  4. একই আরও - সম্ভবত ক্লাবের সমস্ত সদস্যকে পেতে শিক্ষার্থীর সম্পত্তি হিসাবে ক্লাবগুলির একটি তালিকা এবং সেই ক্ষেত্রের একটি সূচক


সুতরাং, মূলত সব কি কেবল তালিকার দরকার? দেখে মনে হচ্ছে কেবল আইডির স্ট্রিংগুলি ম্যানুয়ালি রাখার চেয়ে আরও পরিশীলিত পদ্ধতির হওয়া উচিত। একটির জন্য, আপনি কেবলমাত্র এগুলি ব্যবহার করতে আরও বড় হওয়ার আগেই এতদূর যেতে পারবেন। তারপরে আবারও, নোএসকিউএল প্রযুক্তির প্রধান পোস্টার-চাইল্ড প্রকল্পগুলি (মঙ্গোডিবি, কাউচডিবি, মেমব্যাস, ইত্যাদি) সমস্ত নতুন প্রকল্প যা সম্ভবত আমার কেবল তাদের সম্পর্কের সন্ধানের আরও ভাল উপায় নিয়ে আসতে আরও সময় দেওয়ার প্রয়োজন।
জিওনক্রস

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

2

তোমার আছে

"user": {
    "userid": "unique value",
    "category": "student",
    "metainfo": "yada yada yada",
    "clubs": ["archery", "kendo"]
}

"comments": {
    "commentid": "unique value",
    "pageid": "unique value",
    "post-time": "ISO Date",
    "userid": "OP id -> THIS IS IMPORTANT"
}

"page": {
    "pageid": "unique value",
    "post-time": "ISO Date",
    "op-id": "user id",
    "tag": ["abc", "zxcv", "qwer"]
}

ওয়েল রিলেশনাল ডাটাবেসে সাধারণ কাজটি হ'ল একের সাথে একাধিক সম্পর্কের ক্ষেত্রে ডেটা স্বাভাবিক করা। আপনি একই সাথে কোনও নুএসকিউএল ডাটাবেসেও একই জিনিসটি করবেন। আপনি যে ক্ষেত্রগুলির সাথে তথ্য আনছেন তা কেবল সূচকগুলি করুন।

উদাহরণস্বরূপ, আপনার জন্য গুরুত্বপূর্ণ সূচকগুলি

  • Comment.UserID
  • Comment.PageID
  • Comment.PostTime
  • Page.Tag []

আপনি যদি এনওএসডিবি (এসকিউএল সমর্থনের সাথে একটি। নেট ভিত্তিক নোএসকিউএল ডেটাবেস) ব্যবহার করেন তবে আপনার অনুসন্ধানগুলি এমন হবে

 SELECT * FROM Comments WHERE userid = That user’;

 SELECT * FROM Comments WHERE pageid = That user’;

 SELECT * FROM Comments WHERE post-time > DateTime('2016, 1, 1');

 SELECT * FROM Page WHERE tag = 'kendo'

সমস্ত সমর্থিত ক্যোয়ারী প্রকারগুলি তাদের এসকিউএল চিট শীট বা ডকুমেন্টেশন থেকে পরীক্ষা করুন।

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