CQRS چیست و چه کاربردی دارد؟

جداسازی روش های خواندن اطلاعات (Read Operations) از عملیات بروزرسانی و ثبت (Write Operations) با استفاده از رابط های کاربری مجزا بحثی است که CQRS به آن میپردازد .

زمینه و مشکل

در ساختار های قدیمی از مدل های اطلاعاتی (Data Model) یکسان برای پرس و جو (Query) و بروزرسانی اطلاعات استفاده میشد که ساده بود و برای عملیات پایه CRUD (Create,Read,Update,Delete) مناسب بود . با این حال در نرم افزار های پیچیده تر این میتواند مشکل ساز شود .

برای مثال در سمت Read Data برنامه شما باید Query های زیادی را اعمال کند ، داده ها را واکشی کند و DTO (Data Transfer Object) های واکشی شده را به اشیای مختلف تبدیل نماید (Object Mapping) که میتواند کار بسیار پیچیده ای باشد .

در سمت Write Data برنامه دارای اعتبار سنجی ها و منطق های نرم افزاری (Business Logic) پیچیده است .

در نتیجه با CQRS، شما می توانید برای استفاده از یک مدل که بیش از حد پیچیده و کارهای بسیار زیادی انجام می دهد پایان دهید.

ساختار قدیمی
ساختار قدیمی
  • اغلب عدم تطابق بین خواندن ، ثبت و ارائه اطلاعات مانند ستون های و خصوصیات (Property) اضافی که باید به درستی به روز شود وجود دارد .حتی اگر آنها به عنوان بخشی از یک عملیات مورد نیاز نیست.
  • ساختار های سنتی میتواند اثرات منفی در کارایی واکشی اطلاعات و یا ثبت اطلاعات بر جا بگذارد و یا همچنین میتواند باعث پیچیدگی در اعمال Query ها برای واکشی اطلاعات شود .
  • مدیریت امنیت و دسترسی میتواند بسیار پیچیده شود زیرا هر Entity به هر دو عملیات Read و Write وابسته است .

راه حل

جداسازی عملیات Reads و Writes به مدل های متفاوت کاری است که Cqrs انجام میدهد . برای بروزرسانی اطلاعات از Commands و برای واکشی اطلاعات و خواندن از Queries استفاده میکنیم .


  • دستورات (Commands) باید بجای داده محور وظیفه محور باشد . (Task base)
  • دستورات (Commands) باید به صورت asynchronous (ناهمزمان) پردازش شود.
  • پرس و جو ها (Queries) نباید هیچ گاه تغیری در پایگاه داده بدهند.