gpt4 book ai didi

google-app-engine - ndb建模一对多: merits of repeated KeyProperty vs foreign key

转载 作者:太空宇宙 更新时间:2023-11-03 15:18:35 27 4
gpt4 key购买 nike

我的问题是关于在 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

最佳答案

您是否看过以下关于使用结构化属性的内容https://developers.google.com/appengine/docs/python/ndb/properties#structured .那里关于ContactAddresse 的简短讨论可能会简化您的问题。另请参阅 https://developers.google.com/appengine/docs/python/ndb/queries#filtering_structured_properties .讨论非常简短。

此外,考虑到不允许加入的事实,选项 A 看起来更好。

关于google-app-engine - ndb建模一对多: merits of repeated KeyProperty vs foreign key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13930573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com