これが公式の「ベスト」プラクティスであるかどうかはわかりませんが、一般的には、イベント ソーシングと、イベントを使用して読み取りモデルへの書き込みと更新を行うことが良い方法だと思います。イベント ソーシングでは、書き込みモデルはリレーショナル データベース自体のエンティティや関係としてではなく、イベントの履歴として存在します (最初はかなり混乱するように聞こえます)。
Eventide が (Ruby で) https://eventide-project.org/をどのように実装しているかを見ると、イベント ソーシングについてさらに多くのことを学ぶことができます。
また、ドメイン イベントを使用した CQRS の簡単な紹介もあります: http://lucisferre.net/2010/11/04/a-brief-introduction-to-cqrs/
しかし、それはあなたの当面の質問に実際には答えません. 「書き込み」モデルの状態をリレーショナル データベースに保存したので、トリガーは 1 つの可能な方法ですが、システムを非常にデータ中心にしています。コード内でトリガーを使用して同じことを実行できれば、よりクリーンでテストしやすくなります。
これを行うには、引き続きドメイン イベント パターンを使用し、イベント バスを使用して、読み取りモデルの更新を担当するイベント ハンドラーにイベントを発行します。
これらのイベントとハンドラーは、SQL トリガーのようなものですが、ドメイン設計とその動作に基づいていると考えてください。Udi Dahan には、このアプローチに関する優れた資料がたくさんあります。ドメイン イベントを使用して読み取りモデルを更新していますが、イベント ソーシングは使用されていません。http://www.udidahan.com/?blog=true