我的问题是如何在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
A
,因为你可以为每篇文章使用相同的Tag
,并且你可以通过标签查询Articles
。 - aschmid00