use*_*331 2 google-app-engine database-design google-cloud-datastore
我正在研究一个将在GAE上运行的系统,它将有几个相关的实体,我不确定存储数据的最佳方法.这篇文章是对其他可能有类似经历的人的建议的请求....
系统将拥有用户,包括个人资料数据和图像.这些用户将能够创建"事件"并向其添加日记条目.出于系统的目的,"事件"可能在其中包含1或2个日记帐分录,并且任何超过10个的事件都可能永远不会发生.其他用户也可以为用户的条目添加评论,其中流行的评论可能有数百甚至数千条评论.当随机访问者使用该系统时,他们应该能够看到最新的事件(最新的事件,由其中包含最新日记条目的人定义),按标签搜索以及非常有效的基本文本搜索.然后,在选择要查看的事件时,应显示所有日记帐分录和所有用户评论,其中包含用户图像和评论.用户还应该拥有一种自我管理页面,以查看/修改/删除他们的事件,以及查看/修改/删除他们对其他事件所做的评论.因此,在普通的RDBMS上执行所有这些操作只会查询几个表中的一些大连接.在GAE上,它显然需要以不同的方式工作.以下是我对实体设计的初步想法:
所以,我想听听人们在这里对设计的看法,以及应该做些什么改进来帮助它很好地扩展.谢谢!
Event.id为属性,而是使用自动嵌入每个实体键中的id ,或者在创建实体时在实体上设置唯一键名.Event和JournalEntry:你可以使用ReferenceProperty,你可以家长JournalEntries来Events与祖先查询检索它们,或者你可以存储的名单JournalEntry上键ID或名称Event,并用钥匙查询检索它们的一批.使用逼真分布的虚拟数据尝试一些事情,并使用appstats查看最有效的方法.UserComment引用一个Event,同时JournalEntry引用一个列表UserComments,这有点令人困惑.有没有之间的关系UserComment和JournalEntry?或者只是UserComment和之间Event?UserComment实体并更新我的User实体以及JournalEntry实体和Event实体.UserComments您期望的每个数量Event使得将所有内容都包含在同一个实体组中是不明智的,这意味着您无法以事务方式执行这些写操作,因此您将按顺序执行这些操作,并且实体可能存储在不同的网络节点上,从而使整个操作缓慢; 而且你也会对一致性问题持开放态度.你可以没有这些计数,并考虑将其他人存储在memcache中吗?Event从数据存储区中获取a时,实际上并不关心其搜索索引字列表,并且从协议缓冲区中检索和反序列化它们会产生成本.您可以通过将每个Event搜索索引单词拆分为单独的EventIndex子实体来解决此问题.然后,您可以查询EventIndex您的搜索词,只获取与您的搜索匹配的EventIndex键EventIndexes,派生相应的Events'键key.parent(),并获取Events按键,从不支付搜索索引词列表的检索或反序列化.布雷特·斯拉特金解释了这一策略在这里为14:35.Event.viewCount如果您有很多Event快速连续的视图,则更新将失败,因此您应该尝试计数器分片.祝你好运,并告诉我们你通过尝试的东西学到了什么.
| 归档时间: |
|
| 查看次数: |
872 次 |
| 最近记录: |