【问题标题】:Data Modelling Advice for Blog Tagging system on Google App EngineGoogle App Engine 上博客标签系统的数据建模建议
【发布时间】:2010-09-23 04:16:45
【问题描述】:

我想知道是否有人可以提供一些关于构建数据模型以完成下面描述的简单系统的有效方法的概念性建议。对以非关系方式思考有点陌生,并想尝试避免任何明显的陷阱。我的理解是,一个基本原则是“存储很便宜,不用担心数据重复”,就像在规范化的 RDBMS 中一样。

我想建模的是:

可以被赋予 0-n 个标签的博客文章。许多博客文章可以共享相同的标签。在检索数据时希望允许检索与标签匹配的所有文章。在许多方面与stackoverflow 采用的方法非常相似。

我的正常心态是在标签和博客文章之间创建多对五的关系。然而,我认为在 GAE 的背景下这会很昂贵,尽管我已经看到了它正在完成的例子。

也许使用包含作为文章实体一部分的每个标签的 ListProperty,以及在添加和删除标签时跟踪标签的第二个数据模型?这种方式不需要任何关系,ListProperty 仍然允许查询任何列表元素匹配将返回结果。

关于在 GAE 上解决此问题的最有效方法有什么建议吗?

【问题讨论】:

    标签: python google-app-engine data-modeling


    【解决方案1】:

    多对多听起来很合理。也许你应该先试试看它是否真的很贵。

    G.A.E. 的优点是它会在您使用太多周期时告诉您。免费分析!

    【讨论】:

    • 我也在考虑多对多,但即使是谷歌的文档也警告过这一点,除了最必要的情况。关于分析的好建议,我想我会尝试使用不同的方法运行一些测试并在此处报告结果。
    【解决方案2】:

    一种可能的方法是使用Expando,您可以在其中添加如下标签:

    setattr(entity, 'tag_'+tag_name, True)
    

    然后您可以使用如下标签查询所有实体:

    def get_all_with_tag(model_class, tag):
        return model_class.all().filter('tag_%s =' % tag, True)
    

    当然,您必须清理标签以成为正确的 Python 标识符。我没有尝试过,所以我不确定它是否真的是一个好的解决方案。

    【讨论】:

    • 如果标签名称不必是英文怎么办?
    【解决方案3】:

    感谢两位的建议。我已经实现(第一次迭代)如下。不确定这是否是最好的方法,但它确实有效。

    A 类 = 文章。有一个可以在它的列表元素上查询的 StringListProperty

    B 类 = 标签。每个标签一个实体,还保留使用每个标签的文章总数的运行计数。

    对 A 的数据修改伴随着对 B​​ 的维护工作。认为预先计算计数是在读取繁重的环境中的好方法。

    【讨论】:

    • 只是我要建议的方法,但我没有找到时间。 :)
    【解决方案4】:

    预计算计数是不仅实用,而且也是必要的,因为count()函数返回最大值为1000。如果写争用可能是一个问题,请务必查看分片计数器示例。

    http://code.google.com/appengine/articles/sharding_counters.html

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多