উত্তরগুলির সমস্ত (এই লেখার সময়) রেডিস, মঙ্গোডিবি এবং সম্ভবত একটি এসকিউএল-ভিত্তিক সম্পর্কযুক্ত ডাটাবেস হ'ল মূলত একই সরঞ্জাম: "স্টোর ডেটা"। তারা ডেটা মডেলগুলি মোটেই বিবেচনা করে না।
মঙ্গোডিবি: জটিল তথ্য
মঙ্গোডিবি একটি ডকুমেন্ট স্টোর। একটি এসকিউএল-চালিত রিলেশনাল ডাটাবেসের সাথে তুলনা করতে: রিলেশনাল ডাটাবেসগুলি ইনডেক্সড সিএসভি ফাইলগুলিতে সরল করে, প্রতিটি ফাইল একটি টেবিল; ডকুমেন্ট স্টোরগুলি ইনডেক্সড জেএসওএন ফাইলগুলিতে সরল করে, প্রতিটি ফাইল নথি হয়, একাধিক ফাইল একসাথে গ্রুপ করা হয়।
জেএসওএন ফাইলগুলি কাঠামোর সাথে এক্সএমএল এবং ওয়াইএএমএল ফাইলগুলির মতো এবং পাইথনের মতো অভিধানের মতো, সুতরাং এই ধরণের শ্রেণিবিন্যাসে আপনার ডেটা সম্পর্কে চিন্তা করুন। ইনডেক্স করার সময় কাঠামোটি কী: একটি নথিতে নামযুক্ত কী থাকে যাতে আরও নথি, অ্যারে বা স্কেলারের মান থাকে। নীচের নথিটি বিবেচনা করুন।
{
_id: 0x194f38dc491a,
Name: "John Smith",
PhoneNumber:
Home: "555 999-1234",
Work: "555 999-9876",
Mobile: "555 634-5789"
Accounts:
- "379-1111"
- "379-2574"
- "414-6731"
}
উপরের নথিতে একটি কী রয়েছে PhoneNumber.Mobile
, যার মান রয়েছে555 634-5789
। আপনি দস্তাবেজগুলির সংগ্রহের মাধ্যমে অনুসন্ধান করতে পারেন যেখানে কীটির PhoneNumber.Mobile
কিছু মূল্য রয়েছে; তারা সূচকযুক্ত।
এটিতে একটি অ্যারে রয়েছে Accounts
যার একাধিক সূচক রয়েছে। এটা একটা দলিল যেখানে জন্য আপনার জিজ্ঞাসিত প্রশ্নের করা সম্ভব Accounts
রয়েছে ঠিক , মান কিছু উপসেট সব মূল্যবোধের কিছু উপসেট, অথবা কোন মূল্যবোধের কিছু উপসেট হয়। এর অর্থ আপনি উপরেরটি সন্ধান করতে Accounts = ["379-1111", "379-2574"]
এবং খুঁজে পেতে পারেন না; আপনি Accounts includes ["379-1111"]
উপরের নথির সন্ধান এবং সন্ধান করতে পারেন ; এবং আপনি অনুসন্ধান করতে পারেনAccounts includes any of ["974-3785","414-6731"]
উপরের এবং যে কোনও নথিতে অ্যাকাউন্ট "974-3785" অন্তর্ভুক্ত রয়েছে , যদি কোনও হয়।
ডকুমেন্টগুলি আপনি চান হিসাবে গভীর যান। PhoneNumber.Mobile
একটি অ্যারে, এমনকি একটি উপ-নথি ( PhoneNumber.Mobile.Work
এবং PhoneNumber.Mobile.Personal
) ধরে রাখতে পারে । আপনার ডেটা যদি উচ্চতর কাঠামোগত হয় তবে ডকুমেন্টগুলি আপেক্ষিক ডেটাবেসগুলি থেকে একটি বড় পদক্ষেপ।
যদি আপনার ডেটা বেশিরভাগ সমতল, সম্পর্কিত এবং কঠোরভাবে কাঠামোগত হয় তবে আপনি একটি সম্পর্কিত ডেটাবেস দিয়ে আরও ভাল better আবার, বড় চিহ্নটি হ'ল আপনার ডেটা মডেলগুলি আন্তঃসম্পর্কিত সিএসভি ফাইলগুলির সংগ্রহ বা এক্সএমএল / জেএসএন / ওয়াইএমএল ফাইলগুলির সংকলনের পক্ষে সেরা whether
বেশিরভাগ প্রকল্পের জন্য, আপনাকে আপস করতে হবে, কিছু ছোট জায়গাগুলিতে একটি ছোটখাটো কাজ গ্রহণ করতে হবে যেখানে এসকিউএল বা ডকুমেন্ট স্টোরগুলি উপযুক্ত নয়; কিছু বৃহত, জটিল প্রকল্পের জন্য ডেটা বিস্তৃতভাবে সংরক্ষণ করার জন্য (অনেকগুলি কলাম; সারিগুলি অপ্রাসঙ্গিক), এটি একটি মডেলটিতে কিছু ডেটা এবং অন্য মডেলটিতে অন্য ডেটা সংরক্ষণ করার জন্য অর্থবোধ তৈরি করবে। ফেসবুক এসকিউএল এবং একটি গ্রাফ ডাটাবেস উভয়ই ব্যবহার করে (যেখানে ডেটা নোডে দেওয়া হয়, এবং নোডগুলি অন্যান্য নোডের সাথে সংযুক্ত থাকে); ক্রেগলিস্ট মাইএসকিউএল এবং মঙ্গোডিবি ব্যবহার করত তবে পুরোপুরি মঙ্গোডিবিতে যাওয়ার চেষ্টা করছিল। এগুলি এমন জায়গাগুলি যেখানে কোনও মডেলের অধীনে রাখলে ডেটার স্প্যান এবং সম্পর্কটি গুরুত্বপূর্ণ প্রতিবন্ধীদের মুখোমুখি হয়।
পুনরায়: মূল-মান
রেডিস হ'ল মূলত একটি মূল-মূল্যের দোকান। রেডিস আপনাকে এটিকে একটি কী দিতে এবং একক মান সন্ধান করতে দেয়। রেডিস নিজেই স্ট্রিং, তালিকা, হ্যাশ এবং কয়েকটি অন্যান্য জিনিস সঞ্চয় করতে পারে; তবে এটি কেবল নাম অনুসারে দেখায়।
কম্পিউটার বিজ্ঞানের অন্যতম জটিল সমস্যা ক্যাশে অবৈধতা; অন্যটি জিনিস নামকরণ করা হয়। এর অর্থ আপনি যখন ব্যাক-এন্ডে শত শত অতিরিক্ত লুক আপগুলি এড়াতে চান তখন আপনি রেডিস ব্যবহার করবেন তবে আপনাকে যখন নতুন চেহারা দেখার দরকার হবে তখন আপনাকে খুঁজে বের করতে হবে।
অবৈধতা অধিকাংশ সুস্পষ্ট ক্ষেত্রে লেখার আপডেট: যদি আপনি পড়তে user:Simon:lingots = NOTFOUND
, আপনি পারে SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simon
এবং ফলাফল সংরক্ষণ 100
, যেমন SET user:Simon:lingots = 100
। অতঃপর যখন তোমরা সাইমন 5 lingots পুরস্কার, আপনি পড়তে user:Simon:lingots = 100
, SET user:Simon:lingots = 105
এবং UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon
। আপনার ডাটাবেসে এবং রেডিসে এখন আপনার 105 টি রয়েছে এবং তা পেতে পারেনuser:Simon:lingots
অনুসন্ধান না করেই
দ্বিতীয় ক্ষেত্রে নির্ভরশীল তথ্য আপডেট করা। ধরা যাক আপনি কোনও পৃষ্ঠার অংশ তৈরি করেছেন এবং তাদের আউটপুটকে ক্যাশে করুন। শিরোনাম প্লেয়ারের অভিজ্ঞতা, স্তর এবং অর্থের পরিমাণ দেখায়; প্লেয়ারের প্রোফাইল পৃষ্ঠায় একটি ব্লক রয়েছে যা তাদের পরিসংখ্যান দেখায়; এবং তাই এগিয়ে। খেলোয়াড় কিছু অভিজ্ঞতা অর্জন করে। ওয়েল, এখন আপনি বিভিন্ন আছে templates:Header:Simon
, templates:StatsBox:Simon
, templates:GrowthGraph:Simon
, এবং তাই ঘোষণা ক্ষেত্র যেখানে আপনি একটি হাফ ডজন ডাটাবেসের প্রশ্নের একটি টেমপ্লেট ইঞ্জিন মাধ্যমে চালানো আউটপুট ক্যাশে গেছেন। সাধারণত, আপনি এই পৃষ্ঠাগুলি প্রদর্শন করার সময়, আপনি বলেছেন:
$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
$t = BuildTemplate("StatsBox.tmpl",
GetStatsFromDatabase($playerName));
SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;
আপনি কেবল এর ফলাফল আপডেট করেছেন GetStatsFromDatabase("Simon")
বলে আপনাকে বাদ দিতে হবেtemplates:*:Simon
আপনার কী-মান ক্যাশেটি হবে। আপনি যখন এই টেমপ্লেটগুলির কোনও রেন্ডার করার চেষ্টা করেন, তখন আপনার অ্যাপ্লিকেশনটি আপনার ডাটাবেস (পোস্টগ্রিসএসকিউএল, মঙ্গোডিবি) থেকে ডেটা আনার এবং এটি আপনার টেমপ্লেটে সন্নিবেশ করিয়ে দেবে; তারপরে এটি ফলাফলটি রেডিসে সংরক্ষণ করবে এবং আশা করি, পরের বার এটি আউটপুটটির ব্লক প্রদর্শন করার সময় ডাটাবেস প্রশ্ন তৈরি এবং উপস্থাপনা টেমপ্লেটগুলি বিরক্ত করবে না।
রেডিস আপনাকে প্রকাশক-সাবস্ক্রাইব বার্তাগুলির সারিগুলি এবং এগুলি করতে দেয়। এটি সম্পূর্ণরূপে অন্য একটি বিষয়। এখানে পয়েন্ট হ'ল রেডিস হ'ল একটি মূল-মান ক্যাশে, যা একটি সম্পর্কিত ডেটাবেস বা একটি নথির দোকান থেকে পৃথক।
উপসংহার
আপনার প্রয়োজনের উপর ভিত্তি করে আপনার সরঞ্জামগুলি চয়ন করুন। সবচেয়ে বড় প্রয়োজনটি সাধারণত ডেটা মডেল, কারণ এটি নির্ধারণ করে যে আপনার কোডটি কতটা জটিল এবং ত্রুটি-প্রবণ। বিশেষায়িত অ্যাপ্লিকেশনগুলি পারফরম্যান্সের উপর ঝুঁকবে, যে জায়গাগুলিতে আপনি সমস্ত কিছু সি এবং অ্যাসেমব্লির মিশ্রণে লেখেন; বেশিরভাগ অ্যাপ্লিকেশনগুলি কেবলমাত্র জেনারালাইজড কেস পরিচালনা করবে এবং রেডিস বা মেমক্যাচের মতো একটি ক্যাচিং সিস্টেম ব্যবহার করবে, এটি উচ্চ-পারফরম্যান্স এসকিউএল ডাটাবেস বা ডকুমেন্ট স্টোরের চেয়ে অনেক দ্রুত।