設計模式:命令查詢職責分離 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模式,可以提供一個概念,就是兩個資料庫,一個是負責寫入,另一個負責讀取。
使用ReportingDatabase的一些優點通常可以使得查詢變得更加簡單高效:
- ReportingDatabase的結構和資料表會針對常用的查詢請求進行設計。
- ReportingDatabase資料庫通常會去正規化,存儲一些冗餘而減少必要的Join等聯集查詢操作,使得查詢簡化和高效,一些在主要資料庫中用不到的資料資訊,在ReportingDatabase可以不用存儲。
- 可以對ReportingDatabase重構優化,而不用去改變操作資料庫。
- 對ReportingDatabase資料庫的查詢不會給操作資料庫帶來任何壓力。
- 可以針對不同的查詢請求建立不同的ReportingDatabase庫。
當然這也有一些缺點,比如從庫資料的更新就比較麻煩,也會對資料庫增加負擔。
留言列表