2008-11-20 42 views
8

我想知道是否有人可能会提供一些有效方法来构建数据模型以完成下面描述的简单系统的一些概念性建议。对于以非关系方式进行思考有点新,并且想要避免任何明显的陷阱。我的理解是,一个基本的原则是“存储便宜,不用担心数据重复”,就像您在规范化的RDBMS中一样。Google App Engine上的博客标记系统的数据建模建议

我想什么型号是:

一个博客文章可以给出0-N个标签。许多博客文章可以共享相同的标签。当检索数据时,希望允许检索与标签匹配的所有文章。在很多方面与在此使用的方法非常相似。

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

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

关于在GAE上最有效的方法来解决这个问题的任何建议?

回答

7

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

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

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

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

+0

只是我想建议的方法,除了我没有找到时间。 :) – 2008-11-22 11:32:34

1

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

关于G.A.E的好消息它会告诉你什么时候你使用了太多的循环。免费分析!

+0

我想很多一对多太多,但即使在谷歌,但在所有最必要的情况下,警告不要这个文件。好的建议考虑了分析,我想我会尝试使用不同的方法进行一些测试,并将结果报告回来。 – Matty 2008-11-20 12:03:55

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标识符。我没有尝试过,所以我不确定它是否是一个很好的解决方案。

+1

如果标签名称不必是英文? – 2010-09-14 09:43:07

2

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

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

+0

在最新版本的gae sdk中,count()函数没有最大限制:http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count – 2011-01-18 10:13:53