Python 应用程序引擎NDB评论模型的一些好例子是什么?

Python 应用程序引擎NDB评论模型的一些好例子是什么?,python,google-app-engine,nosql,Python,Google App Engine,Nosql,我正试图在appengine中为我的博客建模一个基本的线性评论系统(你可以在上看到)。我的主要对象类是: 用户, 文章,, 评论 一个用户将有许多评论,应该能够查看他们的评论一目了然 一篇文章会有很多评论,应该一目了然 一条评论将与一个用户和一篇文章关联 我知道如何在一个标准的关系数据库中构建它——比如说,我可能有用于注释、用户和文章的单独表,用外键将它们连接在一起,对文章和用户的唯一性约束,对注释的唯一性约束,等等。没什么了不起的 使用NDB在Python应用程序引擎中对此进行建模的最佳方法是

我正试图在appengine中为我的博客建模一个基本的线性评论系统(你可以在上看到)。我的主要对象类是:

用户, 文章,, 评论

一个用户将有许多评论,应该能够查看他们的评论一目了然

一篇文章会有很多评论,应该一目了然

一条评论将与一个用户和一篇文章关联

我知道如何在一个标准的关系数据库中构建它——比如说,我可能有用于注释、用户和文章的单独表,用外键将它们连接在一起,对文章和用户的唯一性约束,对注释的唯一性约束,等等。没什么了不起的

使用NDB在Python应用程序引擎中对此进行建模的最佳方法是什么?与StructuredProperty一样,ndb.KeyProperty似乎也很有趣。但我不认为我可以使用StructuredProperty,因为评论可以“属于”用户和文章。但是对于ndb.KeyProperty,keyperty似乎不做任何检查或验证逻辑,所以我必须自己实现

我可以做的另一件事就是认输,在用户和文章中存储巨大的JSON blob,表示键和各种注释。这也许是一个不错的解决方案

有什么想法吗

编辑:
这将是高读低写。我可能会在评论上增加一些参与(赞成票/反对票),但即使如此,它也会对阅读有很大的影响

高读低写场景是GAE的特色,因此这对于您的目的来说是一件好事

我会利用GAE模型的优势,因为它确保您在实体组中进行事务/原子操作。我想你不需要太多,但还是有它是件好事

正确的结构取决于您处理/使用数据的方式。我假设您的博客中的典型案例是显示文章的评论,因此,我将使您的评论模型成为文章模型的子模型-然后您可以查询某个(文章)祖先的评论,这将极大地扩展


我会在评论中为作者添加一个KeyProperty,因为它主要用于从我假设的密钥中获取用户。如果要扩展KeyProperty功能,可以这样做。下面是一个关于如何在db中使用的示例。(第1点)

我建议您仔细考虑您计划提供哪些功能,因为以某种方式构建模型可能很难在将来进行某些更改

我会这样做:

首先,假设某种最终的一致性。无论您如何设计,在某些查询中最终都会有一些一致性

在文章中创建一个KeyProperty“owner”来存储用户密钥。如果您希望在查询单个用户的文章时实现强一致性,那么不使用“owner”KeyProperty,只需将用户_key设置为文章的父项即可(这将为用户及其文章创建一个实体组,在这里很好)

有了评论,你可以做更多的事情

  • 如果您预计少于100(取决于网站上的文章大小) 数据存储可以是(更多)评论,为每篇文章创建一个评论 文章中的KeyProperty(repeated=True)存储所有注释键 然后使用get_multi(强一致性)获取它们

    创建注释并修改“文章注释”属性的步骤 您可能需要一个事务,因为您希望完成 两个或两个以上的操作。但是这两个实体不在列表中 同一实体组so:1)使用跨组交易或2)使 评论文章的父项(第二个选项将有一些 (后面讨论的结果)评论的计数很容易,但是 如前所述,仅限于100条或更多评论

  • 创建一个注释ndb模型,该模型具有两个键属性,“所有者”和 “条款”。文章将通过查询获取评论。质疑 一篇文章中的所有评论你都会有 一致性,除非您将文章作为注释的父项 (在这种情况下,当然不要创建article KeyProperty)。这 这种方法允许很多评论

  • 使用实体组的问题在于,例如,如果您允许对注释进行投票,则对每个注释执行单个写入操作将阻止受影响文章的实体组中的任何写入操作。因此,其他用户的创建和投票可能会受到影响。但是,如果你期望很少的选票,并且你保持实体团体的规模很小,那么就不要真的关心这个问题

    如果您想允许评论投票,这可能会变得相当复杂,例如,您可能希望每个用户只投一票。这将需要额外的关系,需要事先考虑

    就我个人而言,我更愿意几乎总是假设最终的一致性


    更多的方法是可能的,但我喜欢这两种。

    谢谢!因此,使用祖先功能对于文章->评论是有意义的,但是每次用户想要查看他们的所有评论时,我是否还需要进行N次额外的阅读查询?此外,如果我理解正确,一篇文章的评论不需要“N”次阅读吗?我目前尝试的解决方案是一种非规范化——每篇文章都有一个StructuredProperty注释列表,用户也有相同的StructuredProperty注释列表(实际注释,无引用)。我正在使用跨组事务以正确的方式进行更新。这里的权衡似乎是太多的并发写作会引起一些轰动,但我暂时同意。。。