Google App Engine数据存储区中的高效1:n关系

时间:2009-07-29 12:03:13

标签: google-app-engine

在我们的系统中,每个用户都可以向任何其他用户写入消息。第一个明显的想法是这样的数据模型:

User
 username
 email
 ... more properties

Message
 user_from_FK
 user_to_FK
 text
 creation-date
 ... more properties

因此,消息将User-Key存储为传统数据库中的FK。喜欢(为了简单可视化为表格):

用户 - “表”

KEY  username ...
-----------------
1    peter
2    paul

KEY

MESSAGE- “表”:

KEY   user_from_FK  user_to_FK  creation-date  text ...
-------------------------------------------------------
11    1             2           2342342342234  Hi Paul.
22    1             2           2342342356455  Hi Paul. You got my message?
33    2             1           2342342377544  Hi Peter. Yes, I did.

查询给定用户的所有消息很简单:

SELECT __key__ FROM Message WHERE user_to_KF = :userKey ORDER BY creation-date

我们的系统应扩展到数百万用户和数百万条消息。每秒可能会发送500条消息。这个简单的解决方案是一个好的数据模型吗?我们可以做得更好吗? (每个用户不允许有超过1000条消息和此收件箱。消息应按返回日期排序。我们希望进行分页。)

更新

对不起。我的消息中的一个信息是错误的:每秒不是500条消息,而是每分钟写入!但很高兴听到性能良好且数据模型有效。伟大的GAE

2 个答案:

答案 0 :(得分:4)

这应该适用于存储/检索数据。 putfetch es不会相互阻挡,如果这是您所担心的。

您可能希望存储更多数据以便在Message模型中显示,因为您无法使用数据存储区JOIN数据。例如,您可以将发件人的名称存储在Message模型中。

对于分页,您可以稍微添加到结构中。请查看以下文章,了解有关如何执行此操作的信息:Paging through large datasets

另请参阅如何在不更改结构的情况下进行分页:Efficient paging using key instead of a dedicated unique property

答案 1 :(得分:0)

您应该考虑denormalization以确保可扩展性。请查看此article at hishscalability.com及相关文章。

当您希望在大量机器上有效扩展时,这是要付出的代价:)