mal*_*vai 5 python google-app-engine nosql
我正在尝试为App Engine中的博客建模一个基本的线性评论系统(你可以在http://codeinsider.us上看到它).我的主要对象类是:
用户,文章,评论
一个用户将有很多评论,应该能够一目了然地查看他们的评论.
一篇文章会有很多评论,应该一目了然.
一条评论只与一个用户和一篇文章相关联.
我知道如何在一个标准的关系数据库中构建它 - 比方说,我可能会为评论,用户和文章分开表,用外键将它们绑在一起,对文章和用户的唯一性限制,以及评论上没有,等等. 没有什么花哨.
使用NDB在Python App Engine中对此进行建模的最佳方法是什么?ndb.KeyProperty看起来很有趣,StructuredProperty也是如此.我不认为我可以使用StructuredProperty,因为评论可以"属于"用户和文章.但是使用ndb.KeyProperty,似乎keyProperty没有执行任何检查或验证逻辑,所以我必须自己实现它.
我能做的另一件事就是放弃,并将巨大的JSON blob存储在代表键和注释的用户和文章中.这可能不是一个糟糕的解决方案.
有什么想法吗?
编辑:这将是高读,低写.我可以在评论(upvotes/downvotes)上添加一些参与度,但即使这样,它也会对阅读产生很大影响.
我建议您仔细考虑您计划提供哪些功能,因为以某种方式构建模型可能会在未来进行一些更改。
我将按如下方式执行此操作:
首先,假设某种最终一致性。无论您如何设计,某些查询都会具有最终的一致性。
在文章中创建一个KeyProperty“所有者”来存储user_key。如果您想在查询单个用户的文章时实现强一致性,那么不要使用“所有者”KeyProperty,只需将 user_key 设置为文章的父项(这将为用户及其文章创建一个实体组,在这里就可以了) )。
通过评论,您可以做更多事情。
如果您预计每篇文章的评论少于 100 个(取决于数据存储上的文章大小,可以更多),请在 Article 中创建 comments KeyProperty(repeated=True) 来存储所有评论键,然后使用 get_multi 获取它们(强一致性)。
要创建评论并修改文章评论属性,您可能需要一个事务,因为您需要完成这两个操作或不完成其中一个操作。但是..两个实体不在同一实体组中,因此:1)使用跨组事务或2)将评论的父级设置为文章(第二个选项将产生稍后讨论的一些后果)评论计数很容易但有限如前所述,达到 100 条或更多评论。
创建一个具有两个 KeyProperties“owner”和“article”的 Comment ndb 模型。文章将通过查询获取评论。要查询文章中的所有评论,您将具有最终一致性,除非您将文章设为评论的父级(在这种情况下,当然不要创建文章 KeyProperty)。这种方法允许大量评论。
使用实体组的问题是,例如,如果您允许对评论进行投票,那么对每个评论的单个写入操作将阻止受影响文章的空洞实体组中的任何写入。因此其他用户的创建和投票可能会受到影响。但如果您预计投票数很少并且实体组规模较小,则不必真正关心这一点。
如果您想允许评论投票,这可能会变得非常复杂,因为您可能只想每个用户投一票。这将需要事先考虑的额外关系。
就我个人而言,我几乎总是倾向于假设最终一致性。
还有更多方法是可能的,但我喜欢这两种。
归档时间: |
|
查看次数: |
397 次 |
最近记录: |