多対多リレーションシップの2つのモデル、TransactionとPersonがあります。各取引には人が含まれています。それぞれの人物には、その人物が接続されている各トランザクションに接続されている金額もあります。そのためには、関係データを使って多対多の関係をモデル化する必要があります。 Googleはこのアプローチをお勧め:この方法でGoogle App Engineのリレーションデータを使用した多対多のモデリング
http://code.google.com/intl/sv-SE/appengine/articles/modeling.html
を私はこのようなモデルがあります:
class TransactionPerson(db.Model):
# References
transaction = db.ReferenceProperty(Transaction, required=True)
person = db.ReferenceProperty(Person, required=True)
# Values
amount = db.FloatProperty(required=True)
をしかし、私はそれぞれの人のための量を要約する必要がある場合ので、私はパフォーマンスのためには、非常に悪い見つけますすべてのトランザクションで、金額を合計しながら「結合」を実装するために、Person * Transaction * TransactionPerson回をループする必要があります。
MY IDEA
私の考えでは、トランザクションモデルに二つのリストを持つことです。私は、関連を見つけるために、それぞれの人のためのすべてのTransactionPersonをループする必要はありません
class Transaction(db.Model):
persons = ListProperty(db.Key)
persons_amount = ListProperty(float)
この方法トランザクション。また、私は依然として人に基づいてトランザクションを照会することができます。
質問
- これは可能ですか?リスト間でインデックスが同期するように、格納/検索時にリストの順序が常に同じであると信じることはできますか?
- これは関連するデータと多対多の関係を実装する良い方法ですか?
しかし、効率の低い操作を引き起こす可能性がある場合、なぜ中間的な関連エンティティは良いアプローチですか?例えばあなたのアプローチで。トランザクションが更新されると、トランザクションに関連付けられたすべてのPersonオブジェクトを更新する必要があることがよくあります。私のアプローチを使用する場合、私はそれを必要としませんか?アソシエーションエンティティを使用する方が良い理由は何ですか? – thejaz
あなたがやっていることのどちらが良い選択かもしれませんが、私の答えは要約データを計算する特定の問題に焦点を当てています。特定の要求を満たすために少数以上のエンティティをロードする必要がある場合は、リクエストからそのプロセスを抽出し、値が変更されたときなど、他の方法で構築する必要があるでしょう。 – SingleNegationElimination
概要データは一例にすぎません。私はしばしば、実際には同じPerson * Transaction * TransactionPersonループになるすべての人をトランザクションに入れたいと思っています。これは、(TransactionPersonを追加したり編集したりした場合)もっと稀です。トランザクションにそのデータ(人のリスト)をキャッシュする必要があるとしても、それは私の質問で提案したものと同じですが、関係データもリストに追加するだけです。重複したデータにつながることはありません。どうしますか? – thejaz