8

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

我想建模的是:

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

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

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

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

4

4 回答 4

7

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

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

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

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

于 2008-11-21T03:22:38.600 回答
2

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

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

于 2009-04-06T21:41:10.937 回答
1

多对多听起来很合理。也许您应该先尝试一下,看看它是否真的很贵。

GAE 的好处是它会在您使用太多周期时告诉您。免费分析!

于 2008-11-20T02:31:29.140 回答
1

一种可能的方法是使用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 标识符。我还没有尝试过,所以我不确定它是否真的是一个好的解决方案。

于 2008-11-20T23:43:15.813 回答