Мой вопрос о моделировании отношений один-ко-многим в 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
Пример (В):
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