সিকিউআরএস ডিডিডি ছাড়াই এবং (বা সাথে?) ইএস - লেখার মডেল কী এবং পড়ার মডেল কী?


11

আমি যতদূর বুঝতে পেরেছি, সিকিউআরএসের পিছনে বড় ধারণাটিতে কমান্ড এবং কোয়েরিগুলি পরিচালনা করার জন্য 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এবং সমস্ত সংযোগের নিজস্ব তালিকা বজায় রাখতে পারি?


মনে রাখবেন যে সিকিউআরএস সিস্টেমে কোয়েরি ডেটা মডেল এবং কমান্ড ডেটা মডেল বিভিন্ন ডেটা বেস থেকে ডেটা গ্রহণ করতে পারে। এবং উভয় মডেলই একে অপরকে পৃথকভাবে বসবাস করতে পারে (বিভিন্ন অ্যাপ্লিকেশন)। বলা হচ্ছে, উত্তরটি "নির্ভরশীল" (যথারীতি)। এটি আগ্রহী
লাইভ

উত্তর:


7

গ্রেগ ইয়ং (২০১০)

সিকিউআরএস হ'ল দু'টি বস্তুর সৃষ্টি যেখানে আগে কেবল একটি ছিল।

আপনি যদি বার্ট্র্যান্ড মেয়ারের কমান্ড কোয়েরি পৃথককরণের বিবেচনা করেন তবে আপনি মডেলটিকে দুটি স্বতন্ত্র ইন্টারফেস হিসাবে বিবেচনা করতে পারেন, একটি যা আদেশকে সমর্থন করে, এবং একটি যা ক্যোয়ারী সমর্থন করে।

interface IChangeTheModel {
    void createUser(string username)
    void followUser(int userAId, int userBId)
    void createPost(int userId, string text)
}

interface IDontChangeTheModel {
    Iterable<Post> getPosts(int userId)
    Iterable<Follower> getFollowers(int userId)
    Iterable<FollowedUser> getFollowedUsers(int userId)
}

class TheModel implements IChangeTheModel, IDontChangeTheModel {
    // ...
}

গ্রেগ ইয়ংয়ের অন্তর্দৃষ্টিটি হ'ল আপনি এটিকে দুটি পৃথক বস্তুর মধ্যে আলাদা করতে পারেন

class WriteModel implements IChangeTheModel { ... }
class ReadModel  implements IDontChangeTheModel {...}

অবজেক্টগুলি পৃথক করে নেওয়ার পরে, আপনার কাছে এখন ডাটা স্ট্রাকচারগুলি পৃথক করার বিকল্প রয়েছে যা বস্তুটির মেমরিটিকে ধরে রাখে, যাতে আপনি প্রতিটি ক্ষেত্রে অপ্টিমাইজ করতে পারেন; বা লিখিত অবস্থা থেকে পৃথকভাবে পঠন স্থিতি সংরক্ষণ / সংরক্ষণ করে।

প্রশ্ন # 1: তারা যেভাবে আমি এটি ব্যবহার করি সেভাবে "রাইট মডেল" শব্দটি ব্যবহার করা কি সঠিক? অথবা ES এর ক্ষেত্রে "রাইটিং মডেল" সর্বদা "ইভেন্ট স্টোর" এর পক্ষে দাঁড়ায়? যদি তা হয় তবে কমান্ডগুলি পরিচালনা করতে আমার যে ডেটা দরকার তা এবং প্রশ্নগুলি পরিচালনা করার জন্য আমার যে ডেটা প্রয়োজন তা কোনও কিছুর মধ্যে বিচ্ছেদ আছে?

রাইটমোডেল শব্দটি সাধারণত মডেলটির পরিবর্তিত প্রতিনিধিত্ব হিসাবে বোঝা যায় (যেমন: বস্তু, দৃ the়তার দোকান নয়)।

টিএল; ডিআর: আমার ধারণা আপনার ব্যবহার ঠিক আছে।

এখানে একটি প্রশ্ন # 2: আমি লিখিত মডেলের সংযোগের তালিকাটি ব্যবহার করি তবে এটি কি কার্যত ঠিক আছে?

এটি "সূক্ষ্ম" - ইশ। ধারণামূলকভাবে, একই কাঠামোগত ভাগ করে পড়া মডেল এবং লেখার মডেলটিতে কোনও সমস্যা নেই।

অনুশীলনে, যেহেতু মডেলকে লেখার জন্য সাধারণত পারমাণবিক হয় না, সম্ভবত একটি সমস্যা থাকে যখন একটি থ্রেড মডেলটির অবস্থা পরিবর্তন করতে চেষ্টা করে যখন দ্বিতীয় থ্রেড এটি পড়ার চেষ্টা করে।

এখানে প্রশ্ন # 3: সংযোগগুলির তালিকা পেতে আমার কোন মডেলটি ব্যবহার করা উচিত? আমি লেখার মডেল ব্যবহার করা উচিত? আমার কি পড়ার মডেল - getFollowersQuery / GetFollowedUserQuery ব্যবহার করা উচিত? বা আমি নিজেই গেটফ্রেন্ডফিডআরকর্ডস কিউরি মডেলটি ইউজারফলডএভেন্ট পরিচালনা করতে এবং সমস্ত সংযোগের নিজস্ব তালিকা বজায় রাখতে পারি?

লেখার মডেলটি ব্যবহার করা ভুল উত্তর।

একাধিক পঠন মডেল রচনা, যেখানে প্রতিটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে সুর করা সম্পূর্ণ যুক্তিসঙ্গত। আমরা বলি "পঠিত মডেল", কিন্তু এটা বোঝা যায় অনেক পঠিত মডেল, প্রতিটি যা একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে জন্য অপ্টিমাইজ করা হয় হতে পারে, এবং নেই না ক্ষেত্রে যেখানে এটা জানার জন্য না বাস্তবায়ন।

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

আপনার নির্দিষ্ট পরিস্থিতিতে যেখানে আপনি এখনও প্যাটার্নটি শিখছেন, আমার পরামর্শটি হ'ল আপনার নকশাটিকে "সরল" রাখুন - এমন একটি পড়ার মডেল থাকতে হবে যা রাইট মডেলের ডেটা কাঠামো ভাগ করে না।


1

আমি আপনাকে বিবেচনা করতে উত্সাহিত করব যে আপনার কাছে একটি ধারণামূলক ডেটা মডেল রয়েছে।

তারপরে রাইটিং মডেলটি সেই ডেটা মডেলটির একটি উপকরণ যা ট্রানজেকশনাল আপডেটের জন্য অনুকূলিত হয়। কখনও কখনও এর অর্থ একটি সাধারণ সম্পর্কযুক্ত ডাটাবেস।

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


(# 1) সিকিউআরএসের জন্য, লেখার মডেলটিকে ইভেন্টের স্টোর হতে হবে না।

(# 2) আমি পড়ার মডেলটি রাইটিং মডেলটিতে রেকর্ড মডেলটিতে নেই এমন কোনও কিছু সংরক্ষণ করার প্রত্যাশা করবো না কারণ একটির জন্য সিকিউআরএসে, ফরওয়ার্ডিং পদ্ধতি ব্যতীত কেউ পড়ার মডেল আপডেট করে না যা পঠন মডেলটির পরিবর্তনের সাথে তাল মিলিয়ে রাখে মডেল লিখুন।

(# 3) সিকিউআরএসে, কোয়েরিগুলি পড়ার মডেলের বিপরীতে হওয়া উচিত। আপনি আলাদা করতে পারেন: এটি ঠিক আছে, কেবল সিকিউআরএস অনুসরণ করছেন না।


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

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