0

オブジェクト参照(集約ルートとその内部エンティティ間の関係は、ルートで定義されたメソッドを介して表現することもできます-> )またはデータベースから関連エンティティを取得するリポジトリを介して、2つのエンティティ間の関連付けを表現できます。 。 •関係がリポジトリを介して表現される場合、クライアントはリポジトリを直接呼び出して関連エンティティを取得します。•関係 を表現する方法の決定は、この関係かどうかに基づいています。SomeRootEnt.BorrowMeIntEnt(...)

完全性を維持するために必要です(そしておそらく行動がそれ自体を表現できるようにするために関連付けを必要とするかどうかについて)

1)関係(たとえば1:* )がリポジトリを介して表現されている場合、子エンティティには親エンティティのIDが含まれている必要があります(注:この質問は、少なくとも親がルートであるか、すべてが同じ内部に存在することを前提としています集計 )?

2)異なる集合体のエンティティ間の関係は、 IDでのみ表現する必要があります

a)なぜですか?

b)そのような関係は本質的にリポジトリを介して表現されませんか?

c) b)に「はい」の場合、これは、特定の動作をサポートする目的で、ほとんどの場合、異なる集合体のエンティティ間の関連付けが必要ないことも示唆しますか?はいの場合、なぜですか?

アップデート:

2a)

ID参照との関係を表現することは、オブジェクト参照との関係を表現することとは異なります。関係をIDで表現する必要がある理由は、トランザクションの整合性を維持するためです。つまり、特定のトランザクションで変更されるのは1つの集計のみです。オブジェクト参照が使用された場合、2つの集計がトランザクションの影響を受ける可能性があります。

I-関係がオブジェクト参照で表現される場合、アグリゲートA1(変更されている)が別のアグリゲートA2に「物理的に」接続されているという事実のために、あなたが言いたいことを理解しています。A1のパーツの1つ(つまり、A2 <-実際にはA2は実際にはA1の一部ではありませんが、ポイントを理解しているといいのですが)は他のパーツと同期していませんか?!

II-しかし、概念的には、A1を変更すると、2つの関係がオブジェクト参照を使用して表現されていなくても、2つの集合体は同期していないため、実際には、A1とA2の違いはどのようになりますか?物理的に接続されていますか?

III-とにかく、どちらの場合でも、結果整合性を使用できないのはなぜですか?

2回目の更新:

original_2)

明確にするために、ルートエンティティ(AR)間の関係はIDで表現する必要があります。個別の集合体の非ルートエンティティ間の参照は禁止する必要があります。

A1非ルートエンティティ からA2ルートエンティティにのみトラバース可能な単方向の関連付けを作成できますか(つまり、A1の非ルートエンティティにはA2ルートのIDが含まれます)。

2)a)

私。

オブジェクト参照が使用された場合、2つの集計がトランザクションの影響を受ける可能性があります。

A1を変更しているトランザクションでA2が変更される可能性があります。IDでA2を参照すると、この可能性が排除されます。また、A1をロードする場合、データベースのロックなどはA2には適用されません。

A1を更新するときにDBロックがA2に適用されないという事実を少しの間無視します-特定の状況で、A1とA2の両方を単一のトランザクション内で変更できるようにすべきではないのはなぜですか?

アグリゲートが整合性の境界を定義することは知っていますが、まれにA1とA2の両方を同じトランザクション内で同期する必要がある場合は、A1とA2の両方を単一のアグリゲートに変換する以外の方法はありません。適切な?!

ありがとうございました

4

1 に答える 1

1

1)はい。たとえば、注文のある顧客がいるとします。顧客のすべての注文を取得するには、注文リポジトリを介して、対応するCustomerIdを持つすべての注文を選択できます。

2)明確にするために、ルートエンティティ(AR)間の関係はIDで表現する必要があります。個別の集合体の非ルートエンティティ間の参照は禁止する必要があります。

2a)ID参照との関係を表現することは、オブジェクト参照との関係を表現することとは異なります。関係をIDで表現する必要がある理由は、トランザクションの整合性を維持するためです。つまり、特定のトランザクションで変更されるのは1つの集計のみです。オブジェクト参照が使用された場合、2つの集計がトランザクションの影響を受ける可能性があります。

2b)はい。リポジトリはトラバーサルを許可し、IDは関係を表します。

2c)これは集合体の要点です-一貫性の境界を定義する必要があります。アグリゲートへの変更がアグリゲートに影響を与える場合、それらの変更は結果整合性のある方法で適用できる必要があります。

アップデート

2a1)A1を変更しているトランザクションでA2が変更される可能性があります。IDでA2を参照すると、この可能性が排除されます。また、A1をロードする場合、データベースのロックなどはA2には適用されません。

2a2)A1を変更するトランザクションによって、A2に適用する必要のある変更が発生した場合、それらの変更は最終的に同期されます。それらを物理的に分離しておく理由は2a1に記載されています。

2a3)可能ですが、2a1で指定された理由により、ID参照を使用する方がよい理由が説明されます。

更新2

2)2つのARの整合性が維持され、参照によって作業がはるかに楽になる場合は、許容できると思います。参照自体は問題ではなく、問題を引き起こす可能性があります。

2a1)この理由の1つは、より新しいドキュメントデータベースアーキテクチャに根ざしています。ドキュメントデータベースは通常、単一のドキュメントでのアトミックトランザクションのみをサポートします。もう1つの理由は、2つのARが異なるデータベースに格納されている可能性があるためです。この場合、整合性を維持するために分散トランザクションが必要になります。ただし、リレーショナルデータベースは確かに複数のテーブルをロックできるため、トランザクションで2つのARが変更されるシナリオが考えられます。結果として、これらの制約はガイドラインとして理解する必要があります。すべての影響が理解され、注意が払われている場合、2つのARを更新することは許容できます。

于 2013-02-06T20:08:39.087 に答える