我有很多(例如)贴有一个或多个标签的帖子。帖子可以创建或删除,用户也可以对一个或多个标签进行搜索请求(结合逻辑与)。我想到的第一个想法是一个简单的模型
class Post(db.Model):
#blahblah
tags = db.StringListProperty()
创建和删除操作的实现是显而易见的。搜索更复杂。要搜索 N 个标签,它将执行 N 个 GQL 查询,例如“SELECT * FROM Post WHERE tags = :1”,并使用游标合并结果,它的性能很差。
第二个想法是将不同实体中的标签分开
class Post(db.Model):
#blahblah
tags = db.ListProperty(db.Key) # For fast access
class Tag(db.Model):
name = db.StringProperty(name="key")
posts = db.ListProperty(db.Key) # List of posts that marked with tag
它从 db 中按键获取标签(比 GQL 快得多)并将其合并到内存中,我认为此实现比第一个实现具有更好的性能,但非常频繁地可用标签可能超过允许单个数据存储对象的最大大小. 还有另一个问题:数据存储区只能修改一个对象约 1/秒,因此对于经常使用的标签,我们也存在修改延迟的瓶颈。
有什么建议么?