在我们的系统中,每个用户都可以向任何其他用户写入消息。第一个明显的想法是这样的数据模型:
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
答案 0 :(得分:4)
这应该适用于存储/检索数据。 put
和fetch
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及相关文章。
当您希望在大量机器上有效扩展时,这是要付出的代价:)