2017-10-31 11 views
-2

私は最近CQRSについてちょっと読んできましたが、私はコマンドの正しい自動番号付き識別子をどのように生成するのだろうと思いました。 indentiferがguidの場合は、Guid.NewGuid()を実行してIDを生成できますが、自動番号付きintテーブルで安全な一意の新しい番号を生成するにはどうすればよいでしょうか?私が最初に考えたのは、あなたが書いているテーブルでmaxを選択できるということです。しかし、2人のユーザが同時に書込みを試みていて、どちらも次の安全なIDを持っていると思うとどうなりますか?キューの最初のものに2番目の書き込み要求を書き込み、拒否させ、書き込み状態を確認するときに再試行パターンを実装しますか?データベース設計を再検討することは選択肢ではないと仮定しましょう。CQRSでは、正しい自動番号付きIDをどのように生成しますか?

+0

? –

+0

データベースがそれを処理するのではなく、自分で行うという付加価値は何ですか? –

+0

データベースに自動的に実行させる場合、書き込み操作の状態を確認するためのIDはありません。 –

答えて

0

このポストを参照してください。ここでは、未使用のidsのブロックを割り当てて、割り当てられたIDを使用して識別子として供給することができます。このアプローチには長所と短所があります。あなただけのシーケンス/ AUTO_INCREMENTから次のIDを選択するDBにリレーすることはできません

http://enterprisecraftsmanship.com/2014/11/15/cqs-with-database-generated-ids/

2

データベースに次のIDを割り当てることを望まない場合は、ドメインモデルのどこかでIDを割り当てる必要があります。ドメインモデルでは、制約は集約によって保護されます。あなたの場合、固有の番号付けは制約なので、一意のIDを生成するために集約を使用する必要があります。

ちなみに、コマンドの一意のIDを生成する必要はありません。コマンドは、ビジネスの観点からのユースケースを表します。固有の連続したギャップのないIDを持つコマンドが必要な場合、インフラストラクチャの要件がドメインに漏洩しています。これは、悪い設計上の決定を示す明確なコードの匂いです。

+0

私は、CQRSパターンが意味を成すいくつかの場所を持つ15歳のアプリを開発しています。しかし、このアプリはほとんどのテーブルで自動ナンバーのプライマリキーで詰まっています。したがって、CQRSパターンを実装したモジュールは、既存のデータベース構造と互換性がなければなりません。私はCQRSパターンでモジュールを構築する自由は持っていますが、設計の特定の側面に影響を与える自由はありません。私が自然の鍵を使用したい/使用できないかのように聞こえますが、私は全体的なデザインにも影響を及ぼさずに運が悪いです。 –

関連する問題