使用Google App Engine中的关系数据对多对多进行建模

the*_*jaz 6 python google-app-engine google-cloud-datastore

我的应用程序中有两个模型,Transaction和Person,具有多对多关系.每笔交易都包含人员.对于每个人,还有与该人员所连接的每个交易相关的金额.因此,我需要模拟与关系数据的多对多关系.谷歌建议这种方法:

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)
Run Code Online (Sandbox Code Playgroud)

但我发现这对性能非常不利,因为如果我需要总结所有交易中每个人的金额,我需要循环Person*Transaction*TransactionPerson次来实现"加入",同时总结金额.

我的想法

我的想法是在Transaction模型中有两个列表:

class Transaction(db.Model):
    persons = ListProperty(db.Key)
    persons_amount = ListProperty(float)
Run Code Online (Sandbox Code Playgroud)

这样我就不需要遍历每个Person的所有TransactionPerson来查找关联的Transaction.我仍然可以根据Person查询事务.

质询

  1. 这可能吗?您是否相信存储/重试时列表顺序始终相同所以索引在列表之间同步?
  2. 这是与关联数据实现多对多关系的好方法吗?

Sin*_*ion 2

我怀疑你正在解决错误的问题。中间关联实体是一个好方法。您遇到的问题是摘要需要很长时间才能计算;你应该更关心这一点;

首选的方法是提前计算汇总数据

在“每人交易总额”的特定情况下,这意味着您想要向人员模型添加一个额外的字段,并使用其所有交易的运行总计来更新它。每当修改 TransactionPerson 时,您都可以更新此值,以便汇总值始终正确。