設計模式:命令查詢職責分離 Command Query Responsibility Segregation Pattern (CQRS)

 

CQRS 是基礎是來自 "命令查詢分離 (Command Query Separation, CQS)" 的概念,是將任何一個對象的方法分成兩大類 :

     命令(Commad): 不返回任何結果,但是會改變對象的狀態

     查詢(Query) : 返回結果,但是不會改變對象的狀態。

一般方法是

    private int i =0;

    private int add(int value)

    {

            i += value:

           return i;

     }

     按照CQS的想法是拆成 Command 和 Query 兩個方法 :

     private void add( int value)

     {

         i += value;

      }

     private int QueryValue()

     {

            return i;

     }

     操作和查詢分離使得我們可以更好掌握對象的細節,了解那些操作會改變對象的狀態,但是這樣需要處理多線程的情況

 

     CQRS是對CQS模式的進一步的簡單模式,也是將一個對象分成兩個對象,一個是Command的對象,另一個是Query的對象。

     在Query的對象,可以專門產生DTOs (Data Transfer Objects)回應給UI

 

     因為CQRS模式,可以提供一個概念,就是兩個資料庫,一個是負責寫入,另一個負責讀取。

    2015-06-26_024859  

       

          使用ReportingDatabase的一些優點通常可以使得查詢變得更加簡單高效:

  • ReportingDatabase的結構和資料表會針對常用的查詢請求進行設計。
  • ReportingDatabase資料庫通常會去正規化,存儲一些冗餘而減少必要的Join等聯集查詢操作,使得查詢簡化和高效,一些在主要資料庫中用不到的資料資訊,在ReportingDatabase可以不用存儲。
  • 可以對ReportingDatabase重構優化,而不用去改變操作資料庫。
  • 對ReportingDatabase資料庫的查詢不會給操作資料庫帶來任何壓力。
  • 可以針對不同的查詢請求建立不同的ReportingDatabase庫。

         當然這也有一些缺點,比如從庫資料的更新就比較麻煩,也會對資料庫增加負擔。

    

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Kenneth 的頭像
    Kenneth

    Kenneth的部落格

    Kenneth 發表在 痞客邦 留言(0) 人氣()