我有一个消息模型,我希望它有几个接收器,可能还有很多接收器。 我还希望能够告诉每个接收者是否查看了消息(已读/未读)。此外,我希望接收器能够删除该消息。
以下两个可能的解决方案,每个我都有一个消息模型和一个用户模型。
第一个(使用此处提供的想法http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html)
我有一个MessageReceivers类,它有一个ListProperty,其中包含将接收消息并将父设置为消息的用户。我使用messages = db.GqlQuery('SELECT __key__ FROM MessageReceivers WHERE receivers = :1', user)
和执行db.get([ key.parent() for key in messages ])
来查询此内容。
我遇到的问题是,我不确定如何存储消息的状态:是否读取以及后续问题用户是否有新消息。另一个问题是删除消息的开销(必须从接收者列表属性中删除用户)
您认为这两个中的哪一个有更好的表现?在第一种情况下,您对处理消息状态有任何建议。
答案 0 :(得分:1)
我在生产中实施了第一个选项。缺点是如果使用自定义索引,ListProperty限制为2500个条目。无耻的插件:请参阅我的博客b http://bravenewmethod.wordpress.com/2011/03/23/developing-on-google-app-engine-for-production/
读取状态存储。我通过实现一个实体来实现这一点,该实体在几个月前存储了未读消息,然后只是假设读取了较旧的消息。更简单的方法是按日期顺序查询消息,并将最后已知的消息时间戳存储在实体中,并将所有较旧的消息设置为读取。我不建议在具有巨大列表属性的实体中保留长历史,因为读取和存储此类实体可能会变得非常慢。
删除邮件的费用很高,无法解决。
答案 1 :(得分:0)
如果你需要为每条消息存储状态,你最好的选择是为每个接收者写一个实体,具有读状态(以及其他任何东西,如标志等),而不是使用索引关系模式。