主に会社を管理しているシステム構築しています

会社は住所、電話番号、ユーザーに公開するかしないかの公開ステータス、URLなどの多くの情報を持ちます

またそれぞれの情報が更新される頻度はバラバラです

会社の読み取りユースケースはたくさんあり、住所のみを取得したいケースや、電話番号のみを取得したいケース、公開ステータスなどの情報を取得したいケースがあります

ただ住所を取得する際に公開ステータスが非公開であれば、住所非公開で返したく、また電話番号についても同様です

このとき住所と電話番号取得前に公開ステータスを取得しないといけない前提が出てきて、公開ステータス取得コードが重複しないようにしたいです

そうするためには

repository.getAddress(会社ID, 公開ステータス) returns 住所
のように、repositoryの住所取得メソッドに公開ステータスを渡す形になりますでしょうか?

また以下のような案もあります

1つの会社entityを作り、そのentityを丸々返すエンドポイントのみにするとします

そのentityは公開ステータス項目を持ち、電話番号と住所取得メソッドでその項目を参照するようにします

そして電話番号のみ取得したいケースでもその会社を丸々返すエンドポイントを呼ぶようにします 不要な情報まで取得してしまいますが、それはキャッシュでどうにかします

この案についてもどう思われますか?

リポジトリは集約を保存・取得・検索・削除する責務なので、repository#getAddressならAddressが集約ならありです。基本的に集約単体か集約の集合を取得する以外のことはしません。

要は、会社集約とするか、それぞれ別々の集約にするかということですよね。別々にするとリポジトリも個々の集約ごとに必要なりますし、整合性の境界が異なるのでトランザクションも異なります。つまり、異なる集約間は結果整合になります。

単一の集約を用いるか、複数の集約に分割するかという選択は、プロジェクトの具体的な要求に大きく依存します。この決定を左右する主な要因には、データの更新頻度と粒度、トランザクションの整合性要求、パフォーマンスとスケーラビリティの要件、セキュリティとアクセス制御の細かさ、ビジネスプロセスとワークフローの構造、チーム編成と開発プロセス、そして将来の拡張性に関する予測が含まれます。

単一の集約アプローチは、すべての会社情報が同時に更新されることが多く、強い整合性が求められる場合に適しています。このアプローチは、データ管理がシンプルで、開発が比較的容易である利点があります。一方、集約を分割するアプローチは、住所、電話番号、URLなどの情報が独立して頻繁に更新され、それぞれに異なるアクセス制御が必要な場合に有効です。

また、大規模なデータセットを扱う際のパフォーマンス最適化や、将来的な拡張性を重視する場合にも、分割アプローチが適している可能性が高くなります。具体的には、年に1回程度の住所変更に対し、月に複数回の電話番号変更が予想される場合や、住所は一般公開可能だが電話番号は認証済みユーザーにのみ公開するといった要求がある場合は、集約の分割を検討する価値があります。

さらに、「5年後には100万社以上のデータを管理する予定がある」といった大規模なスケーラビリティ要求や、「今後、会社の社会貢献活動情報や環境への取り組みなど、新しい種類の情報を追加する予定がある」といった拡張性の要求がある場合も、分割アプローチが適しているでしょう。一方で、「住所変更と電話番号変更は必ず同時に行われ、両方成功しないと更新してはいけない」といった強い整合性要求がある場合や、「会社の基本情報ページの表示は常にすべての情報を含み、100ms以内に完了する必要がある」といったパフォーマンス要求がある場合は、単一の集約アプローチが適している可能性が高くなります。

最終的な設計の決定は、これらの要求のバランスを慎重に検討し、プロジェクトの現在のニーズと将来の方向性を考慮して行う必要があります。また、選択した設計が将来の要求変更にも対応できる柔軟性を持っていることを確認することが重要です。

どのアプローチを選択する場合でも、ドメインモデルの整合性を保ち、効率的なデータ取得できればよいと思います。例えば書き込み時は会社集約単位で整合性を担保する。読み込み時は必要なデータを選択して読み込むというアプローチが取れればいいのだと思います。それがCQRSのアプローチです。検討してみてください。

2か月2か月更新

利用規約プライバシーポリシーに同意の上ご利用ください

加藤潤一(かとじゅん)さんの過去の回答
    Loading...