我的问题是关于在 ndb 中建模一对多关系。我知道这可以通过(至少)两种不同的方式完成:使用重复属性或使用“外键”。我在下面创建了一个小例子。基本上我们有一篇文章,它可以有任意数量的标签。假设标签可以删除,但添加后无法更改。我们还假设我们不担心交易安全。
我的问题是:建模这些关系的首选方式是什么?
我的考虑:
- 方法 (A) 需要对添加到文章的每个标签进行两次写入(一个用于文章,一个用于标签),而方法(B)只需要一次写入(仅标签)。
- 方法 (A) 在获取文章的所有标签时利用 ndb 的缓存机制,而在方法 (B) 的情况下需要查询(另外还有一些自定义缓存)
我在这里遗漏了一些东西,还有其他需要考虑的因素吗?
非常感谢您的帮助。
示例(A):
class Article(ndb.Model):
title = ndb.StringProperty()
# some more properties
tags = ndb.KeyProperty(kind="Tag", repeated=True)
def create_tag(self):
# requires two writes
tag = Tag(name="my_tag")
tag.put()
self.tags.append(tag)
self.put()
def get_tags(self):
return ndb.get_multi(self.tags)
class Tag(ndb.Model):
name = ndb.StringProperty()
user = ndb.KeyProperty(Kind="User") # User that created the tag
# some more properties
示例(B):
class Article(ndb.Model):
title = ndb.StringProperty()
# some more properties
def create_tag(self):
# requires one write
tag = Tag(name="my_tag", article=self.key)
tag.put()
def get_tags(self):
# obviously we could cache this query in memcache
return Tag.gql("WHERE article :1", self.key)
class Tag(ndb.Model):
name = ndb.StringProperty()
article = ndb.KeyProperty(kind="Article")
user = ndb.KeyProperty(Kind="User") # User that created the tag
# some more properties