আমি যতদূর বুঝতে পেরেছি, সিকিউআরএসের পিছনে বড় ধারণাটিতে কমান্ড এবং কোয়েরিগুলি পরিচালনা করার জন্য 2 টি পৃথক ডেটা মডেল রয়েছে। এগুলিকে বলা হয় "রাইট মডেল" এবং "পড়ুন মডেল"।
টুইটার অ্যাপ্লিকেশন ক্লোনটির একটি উদাহরণ বিবেচনা করি। কমান্ডগুলি এখানে:
- ব্যবহারকারীরা তাদের নিবন্ধন করতে পারেন।
CreateUserCommand(string username)নিঃসরণ করেUserCreatedEvent - ব্যবহারকারীরা অন্যান্য ব্যবহারকারীদের অনুসরণ করতে পারেন।
FollowUserCommand(int userAId, int userBId)নিঃসরণ করেUserFollowedEvent - ব্যবহারকারীরা পোস্ট তৈরি করতে পারেন।
CreatePostCommand(int userId, string text)নিঃসরণ করেPostCreatedEvent
আমি উপরে "ইভেন্ট" শব্দটি ব্যবহার করার সময়, আমার অর্থ 'ইভেন্ট সোর্সিং' ইভেন্টগুলি নয়। আমি কেবলমাত্র এমন সংকেত বোঝাই যা মডেল আপডেটগুলি পড়ে। আমার কোনও ইভেন্ট স্টোর নেই এবং এখন পর্যন্ত সিকিউআরএস নিজেই মনোনিবেশ করতে চাই।
এবং এখানে প্রশ্নগুলি:
- একজন ব্যবহারকারীকে তার পোস্টগুলির তালিকা দেখতে হবে।
GetPostsQuery(int userId) - একজন ব্যবহারকারীকে তার অনুসরণকারীদের তালিকাটি দেখতে হবে।
GetFollowersQuery(int userId) - একজন ব্যবহারকারীকে নিম্নলিখিত ব্যবহারকারীদের তালিকাটি দেখতে হবে।
GetFollowedUsersQuery(int userId) - কোনও ব্যবহারকারীর "বন্ধু ফিড" দেখতে হবে - তাদের সমস্ত বন্ধুর ক্রিয়াকলাপের লগ ("আপনার বন্ধু জন একটি নতুন পোস্ট তৈরি করেছেন")।
GetFriedFeedRecordsQuery(int userId)
হ্যান্ডেল করতে CreateUserCommandআমার জানতে হবে যে এই জাতীয় ব্যবহারকারীর ইতিমধ্যে উপস্থিত রয়েছে কিনা। সুতরাং, এই মুহুর্তে আমি জানি যে আমার লেখার মডেলটিতে সমস্ত ব্যবহারকারীর একটি তালিকা থাকা উচিত।
হ্যান্ডেল করার জন্য FollowUserCommandআমাকে জানতে হবে ইউজারএল ইতিমধ্যে ইউজারবি অনুসরণ করে কিনা। এই মুহুর্তে আমি চাই আমার লেখার মডেলটিতে সমস্ত ব্যবহারকারীর অনুসরণ-ব্যবহারকারীর সংযোগের একটি তালিকা রয়েছে।
এবং পরিশেষে, পরিচালনা করার জন্য CreatePostCommandআমার মনে হয় না যে আমার আর কোনও কিছুর দরকার নেই, কারণ আমার মতো কমান্ড নেই UpdatePostCommand। আমার যদি সেগুলি থাকে তবে আমার অবশ্যই পোস্টটি বিদ্যমান রয়েছে তা নিশ্চিত করা দরকার, সুতরাং আমার সমস্ত পোস্টের একটি তালিকা প্রয়োজন। তবে আমার এই প্রয়োজনীয়তা না থাকায় আমার সমস্ত পোস্ট ট্র্যাক করার দরকার নেই।
প্রশ্ন # 1 : তারা যেভাবে আমি এটি ব্যবহার করি সেভাবে "রাইট মডেল" শব্দটি ব্যবহার করা কি সঠিক? অথবা ES এর ক্ষেত্রে "রাইটিং মডেল" সর্বদা "ইভেন্ট স্টোর" এর পক্ষে দাঁড়ায়? যদি তা হয় তবে কমান্ডগুলি পরিচালনা করতে আমার যে ডেটা দরকার তা এবং প্রশ্নগুলি পরিচালনা করার জন্য আমার যে ডেটা প্রয়োজন তা কোনও কিছুর মধ্যে বিচ্ছেদ আছে?
হ্যান্ডেল করতে GetPostsQuery, আমার সমস্ত পোস্টের একটি তালিকা প্রয়োজন। এর অর্থ হল আমার পড়ার মডেলটিতে সমস্ত পোস্টের একটি তালিকা থাকা উচিত। আমি শুনে এই মডেলটি বজায় রাখছি PostCreatedEvent।
উভয় হ্যান্ডেল করতে GetFollowersQueryএবং GetFollowedUsersQueryআমি ব্যবহারকারীদের মধ্যে সব সংযোগ একটি তালিকা প্রয়োজন হবে। এই মডেলটি বজায় রাখতে আমি শুনতে যাচ্ছি UserFollowedEvent। এখানে একটি প্রশ্ন # 2 : আমি লিখিত মডেলের সংযোগের তালিকাটি ব্যবহার করি তবে এটি কি কার্যত ঠিক আছে? বা আমার আরও ভাল একটি পৃথক পঠন মডেল তৈরি করা উচিত, কারণ ভবিষ্যতে আমার লেখার মডেলের চেয়ে আরও বিশদ থাকতে হবে?
অবশেষে, হ্যান্ডেল করার জন্য GetFriendFeedRecordsQueryআমার এই প্রয়োজন হবে:
- শোনা
UserFollowedEvent - শোনা
PostCreatedEvent - অন্যান্য ব্যবহারকারীরা কোন ব্যবহারকারী অনুসরণ করেন তা জানুন
যদি ব্যবহারকারী এ ব্যবহারকারী বি অনুসরণ করে এবং ব্যবহারকারী বি ব্যবহারকারী সি অনুসরণ করতে শুরু করে, নিম্নলিখিত রেকর্ডগুলি উপস্থিত হওয়া উচিত:
- ব্যবহারকারীর জন্য: "আপনার বন্ধু ব্যবহারকারী বি সবেমাত্র ব্যবহারকারী সি অনুসরণ করা শুরু করেছেন"
- ব্যবহারকারী বি এর জন্য: "আপনি কেবল ব্যবহারকারী সি অনুসরণ করা শুরু করেছেন"
- সি সি ব্যবহারকারীর জন্য: "ব্যবহারকারী বি এখন আপনাকে অনুসরণ করছে"
এখানে প্রশ্ন # 3 : সংযোগগুলির তালিকা পেতে আমার কোন মডেলটি ব্যবহার করা উচিত? আমি লেখার মডেল ব্যবহার করা উচিত? আমি পড়ার মডেল ব্যবহার করা উচিত - GetFollowersQuery/ GetFollowedUsersQuery? বা আমি GetFriendFeedRecordsQueryনিজেই মডেলটিকে পরিচালনা করতে UserFollowedEventএবং সমস্ত সংযোগের নিজস্ব তালিকা বজায় রাখতে পারি?