পটভূমি:
আমি একটি সার্ভার অ্যাপ্লিকেশন ডিজাইন করছি এবং বিভিন্ন সাবসিস্টেমের জন্য পৃথক dll গুলি তৈরি করছি। জিনিসগুলিকে সরল করার জন্য, আমার বলি যে আমার দুটি সাবসিস্টেম রয়েছে: 1) Users2)Projects
ব্যবহারকারীর সার্বজনীন ইন্টারফেসের মতো পদ্ধতি রয়েছে:
IEnumerable<User> GetUser(int id);
এবং প্রকল্পগুলির পাবলিক ইন্টারফেসের মতো একটি পদ্ধতি রয়েছে:
IEnumerable<User> GetProjectUsers(int projectId);
সুতরাং, উদাহরণস্বরূপ, যখন আমাদের কোনও নির্দিষ্ট প্রকল্পের জন্য ব্যবহারকারীদের প্রদর্শনের প্রয়োজন হয়, আমরা কল করতে পারি GetProjectUsersএবং এটি একটি ডেটাগ্রিড বা অনুরূপ প্রদর্শনের জন্য পর্যাপ্ত তথ্য সহ বস্তুগুলিকে ফিরিয়ে দেয়।
সমস্যা:
আদর্শভাবে, Projectsসাবসিস্টেমটি ব্যবহারকারীর তথ্যও সংরক্ষণ করা উচিত নয় এবং এটি কোনও প্রকল্পে অংশ নেওয়া ব্যবহারকারীদের আইডি সংরক্ষণ করা উচিত। পরিবেশন করার জন্য GetProjectUsers, সেটিতে কল করতে হবে GetUserএর Usersপ্রত্যেক ব্যবহারকারীর আইডি নিজস্ব ডাটাবেসের মধ্যে সংরক্ষিত জন্য সিস্টেম। তবে এটির জন্য প্রচুর পৃথক GetUserকল প্রয়োজন যা Userসাবসিস্টেমের অভ্যন্তরে পৃথক পৃথক স্কেল কোয়েরি তৈরি করে । আমি সত্যিই এটি পরীক্ষা করে দেখিনি তবে এই চ্যাটি ডিজাইনটি সিস্টেমের স্কেলাবিলিটিটিকে প্রভাবিত করবে।
আমি যদি সাবসিস্টেমগুলির বিভাজনকে একপাশে রাখি, তবে আমি উভয় সিস্টেমে অ্যাক্সেসযোগ্য একক স্কিমায় সমস্ত তথ্য সংরক্ষণ করতেProjects পারতাম এবং JOINসমস্ত প্রকল্প ব্যবহারকারীদের একক ক্যোয়ারীতে পেতে কেবল একটি কাজ করতে পারি । ক্যোয়ারির ফলাফলগুলি থেকে Projectsকীভাবে Userঅবজেক্ট তৈরি করা যায় তাও জানতে হবে । তবে এটি বিচ্ছেদকে ভেঙে দেয় যার অনেক সুবিধা রয়েছে।
প্রশ্ন:
কেউ এই সমস্ত ব্যক্তিগত GetUserকল চলাকালীন এড়িয়ে চলার সময় পৃথকীকরণের কোনও উপায়ের পরামর্শ দিতে পারেন GetProjectUsers?
উদাহরণস্বরূপ, আমার কাছে যে ধারণাটি ছিল তা হ'ল ব্যবহারকারীরা বাহ্যিক সিস্টেমগুলিকে একটি লেবেল-মান জুটির সাহায্যে ব্যবহারকারীদের "ট্যাগ" করতে এবং নির্দিষ্ট মান সহ ব্যবহারকারীদের অনুরোধ করার জন্য যেমন:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
তারপরে প্রকল্পগুলি প্রকল্পে যুক্ত হওয়ার সাথে সাথে প্রতিটি ব্যবহারকারীকে ট্যাগ করতে পারে:
AddUserTag(userId,"project id", myProjectId.ToString());
এবং গেটপ্রজেক্ট ব্যবহারকারীদের সময়, এটি সমস্ত প্রকল্প ব্যবহারকারীদের একক কলে অনুরোধ করতে পারে:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
যে অংশটি সম্পর্কে আমি নিশ্চিত নই: হ্যাঁ, ব্যবহারকারীরা প্রকল্পগুলি সম্পর্কে জ্ঞাত জ্ঞাত হন তবে প্রকৃতপক্ষে প্রকল্পের সদস্যপদ সম্পর্কে তথ্য ব্যবহারকারীদের সিস্টেমে সংরক্ষণ করা হয়, প্রকল্প নয়। আমি কেবল প্রাকৃতিক অনুভূতি বোধ করি না তাই আমি নির্ধারণ করার চেষ্টা করছি যে এখানে আমার কোনও বড় অসুবিধা নেই যেটি অনুপস্থিত।