Token导航 LogoToken导航TokenDH.com
研究检索权限需确认github未标认证来源可访问许可证需确认审计通过

cqrs-aggregate-modelingCQRS 聚合建模

Agent Skill

cqrs-aggregate-modeling 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

475

周安装

20

GitHub Stars

75

下载量

166
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:cqrs-aggregate-modeling(CQRS 聚合建模)
来源仓库:https://github.com/j5ik2o/okite-ai
仓库路径:skills/cqrs-aggregate-modeling
安装命令:
npx skills add https://github.com/j5ik2o/okite-ai --skill cqrs-aggregate-modeling
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/j5ik2o/okite-ai --skill cqrs-aggregate-modeling

简介

cqrs-aggregate-modeling 分析 CQRS 引入后聚合建模的变化,强调最小状态保持与读模型委托。

  • 适用于解决传统聚合肥大化问题,指导读写模型间的数据边界划分。
  • 提供线程聚合等典型案例,展示更新时全量加载与增量优化的性能差异。
  • 内容以日文编写,需人工复核术语翻译与架构建议的准确性。
  • 适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

SKILL.md

CQRSによる集約の境界再定義

CQRSを導入すると集約のモデリングが変わる。集約はコマンド実行に必要な最小限の状態のみ保持し、読み取り責務はリードモデルに委譲する。

問題: 肥大化した集約

典型例: Thread集約が1000件のメッセージを保持

// 従来型: 集約がすべてのデータを保持
case class Message(id: MessageId, text: MessageText, senderId: AccountId,
                   createdAt: Instant, updatedAt: Instant)
case class Messages(values: List[Message])

class Thread(id: ThreadId, members: Members, messages: Messages,
             createdAt: Instant)

更新時の問題

1. threadRepository.findById(threadId)
   → 1000件のメッセージを含むスレッド全体をDBから取得

2. thread.addMessage(...)
   → メッセージを1件追加

3. threadRepository.store(newThread)
   → 1001件全体をDBに更新
   → どのフィールドが更新されたか不明なため、全情報を更新する必要がある

1件のメッセージ追加のために1001件を更新する。 これは集約が「コマンドに必要なデータ」と「クエリに必要なデータ」を区別せずに保持していることが原因。

差分更新の誘惑

差分更新を実装しようとすると、集約の内部実装が複雑化する。どのフィールドが変更されたかを追跡する仕組みが必要になり、ドメインロジックとインフラの関心が混在する。

解決: CQRSによる集約の再設計

核心原則

CQRSを導入すると、集約はコマンド実行に必要な最小限の状態だけ持てばよい。

読み取り責務(クエリ)を集約から完全に除去し、リードモデルに委譲する。その結果、集約はコマンドの検証に必要な情報のみ保持する。

問い: このコマンドの検証に何が必要か?

Thread集約の場合、「メッセージ追加」コマンドの検証に必要なのは:

  • 送信者がスレッドのメンバーであること → メンバーIDのリストが必要
  • メッセージIDの重複がないこと → メッセージIDのリストが必要

メッセージの本文は不要。 本文は表示(クエリ)のために必要であり、コマンドの検証には関係ない。

再設計後の集約

// CQRS/ES: 集約はコマンド検証に必要な最小限の状態のみ保持
class Thread(id: ThreadId, memberIds: MemberIds, messageIds: MessageIds,
             createdAt: Instant) {

  def addMessage(messageId: MessageId, messageText: MessageText,
                 senderId: AccountId): Either[ThreadError, Thread] =
    if (memberIds.contains(senderId)) {
      // イベントを追記するだけ。1001件の更新は発生しない
      persistEvent(MessageAdded(id, messageId, messageText, senderId, Instant.now))
      Right(copy(messageIds = messageIds.add(messageId)))  // IDのみ追加
    } else {
      Left(new AddMessageError)
    }
}

メッセージ本文を持たないため、集約は大幅に軽量化される。

イベントの設計

sealed trait ThreadEvent

case class MemberAdded(threadId: ThreadId, accountId: AccountId,
                       occurredAt: Instant) extends ThreadEvent

case class MessageAdded(threadId: ThreadId, messageId: MessageId,
                       messageText: MessageText, senderId: AccountId,
                       occurredAt: Instant) extends ThreadEvent

case class MessageUpdated(threadId: ThreadId, messageId: MessageId,
                         messageText: MessageText, senderId: AccountId,
                         occurredAt: Instant) extends ThreadEvent

イベントにはメッセージ本文を含める(リードモデル構築に必要なため)。ただし、集約の状態復元時にはIDのみを反映する。

リードモデル(Q側)

// イベントを消費してリードモデルを構築
consumeEventsByThreadIdFromDDBStreams.foreach {
  case ev: MemberAdded   => insertMember(ev)
  case ev: MessageAdded  => insertMessage(ev)
  case ev: MessageUpdated => updateMessage(ev)
}

// リードモデルはクエリに最適化されたDTO
case class MessageDto(id: Long, threadId: Long, text: String,
                     senderId: Long, createdAt: Instant, updatedAt: Instant)

// 部分取得が可能(ページネーション等)
val messages: Seq[MessageDto] =
  MessageDao.findAllByThreadIdWithOffsetLimit(threadId, 0, 100)

Before / After 比較

観点従来型(非CQRS)CQRS/ES
集約の状態メッセージ全文を保持メッセージIDのみ保持
メッセージ追加全件更新イベント1件追記
読み取り集約から直接取得リードモデルから取得
メモリ使用量メッセージ数に比例して増大ID数に比例(軽量)
ページネーション集約内で実装(複雑)リードモデルのDAO(自然)

集約の境界再定義の考え方

判断基準: コマンドの検証に必要か?

集約が保持すべきデータを決めるには、各コマンドの検証ロジックを分析する。

集約が現在保持しているデータ
    ↓
各フィールドについて:
    「このデータはコマンドの検証に使われるか?」
    ├─ YES → 集約に残す
    └─ NO → クエリ専用データ → リードモデルへ移動

具体例: Thread集約の分析

データコマンド検証に必要か判断
メンバーID一覧YES(送信者がメンバーか確認)集約に残す
メッセージID一覧YES(重複チェック)集約に残す
メッセージ本文NO(表示のみ)リードモデルへ
送信者名NO(表示のみ)リードモデルへ

強い整合性の再検討

CQRSを導入する際に問うべき:

スレッドとメッセージの関係性に強い整合性は必要か?
  • メッセージの追加・表示に「メッセージ本文の即時一貫性」は不要
  • メンバーシップの確認にのみ強い一貫性が必要
  • 振る舞いがイメージできれば集約の構造が明確になる

大きすぎる集約の兆候と対処

兆候

兆候原因
集約の読み込みが遅い不要なデータを大量に保持
更新時に全件SQLが発生差分が追跡できない
集約内にページネーションロジッククエリ責務が混在
DTOと集約の構造が酷似クエリ用データがそのまま集約に

対処フロー

集約が大きすぎる
    ↓
1. 各フィールドを「コマンド検証用」と「クエリ用」に分類
    ↓
2. クエリ用データをリードモデルへ移動(CQRSの導入)
    ↓
3. 集約はIDリストや状態フラグなど最小限の状態のみ保持
    ↓
4. イベントで状態変更を記録し、リードモデルはイベントから構築

関連スキルとの関係

スキル関係
aggregate-design集約の内部設計原則。本スキルはCQRSによる境界の再定義
cqrs-to-event-sourcingなぜESが必要か。本スキルはES前提のモデリング変革
cqrs-tradeoffs一貫性・可用性のトレードオフ。本スキルはモデリングへの影響

レビューチェックリスト

集約の肥大化

  • 集約がクエリ専用データ(表示名、計算結果等)を保持していないか
  • 集約の読み込みにパフォーマンス問題がないか
  • 更新時に不要な全件更新が発生していないか

CQRS/ESによる再設計

  • 各フィールドが「コマンド検証に必要か」で分類されているか
  • クエリ専用データはリードモデルに委譲されているか
  • 集約はIDリスト等の最小限の状態のみ保持しているか
  • イベントにはリードモデル構築に必要な情報がすべて含まれているか

境界の妥当性

  • 集約内のデータすべてに強い整合性が本当に必要か再検討したか
  • 振る舞い(コマンド)に基づいて集約の境界を決めているか
  • 結果整合性で十分なデータを集約から分離しているか

関連スキル(併読推奨)

このスキルを使用する際は、以下のスキルも併せて参照すること:

  • cqrs-to-event-sourcing: イベントソーシングが集約モデリングを変える理由
  • aggregate-design: CQRS適用前の基本的な集約設計ルール
  • cqrs-tradeoffs: CQRS採用のトレードオフ分析

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

34.88%
按下载量换算58

Claude

28.73%
按下载量换算48

Cursor

18.92%
按下载量换算31

Gemini CLI

9.76%
按下载量换算16

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

权限需确认

当前来源未能明确判断权限范围,默认进入异常复核队列。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills