Soruma ndb'de bire çok ilişki modelleme ile ilgili. Bunun (en azından) iki farklı yolla yapılabileceğini anlıyorum: tekrarlanan bir mülkle veya bir 'yabancı anahtarla'. Aşağıda küçük bir örnek oluşturdum. Temel olarak, keyfi sayıda Etikete sahip bir Madde var. Bir Etiketin kaldırılabildiğini ancak eklendikten sonra değiştirilemeyeceğini varsayalım. Ayrıca, işlem güvenliği konusunda endişelenmediğimizi varsayalım.ndb bire çok modelleme: yinelenen KeyProperty vs yabancı anahtarın faydaları
Sorum şu: Bu ilişkileri modellemenin tercih edilen yolu nedir?
Benim hususlar:
- Yaklaşım (A) sadece gerektirir (B) yaklaşım ise bir makalesinde (Etiketi için maddesinde için ve bir) eklenir her etiket için iki yazma gerektirir bir yazı (sadece Tag). bazı şeyler yaklaşımı (B) bir sorgu gerekli (ve ek olarak bazı özel önbelleğe) olduğu
durumunda oysa bir maddede için tüm Etiketler var mıdır getirirken
Yardımlarınız için çok teşekkürler.
Örnek (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
Örnek (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
Performansı belirli bir sorununun belirli bir cevabı olabileceği gibi, özellikle de gerçek kullanımınızla daha fazla ilişkili olduğu ve bu nedenle de yukarıdaki uygulama seçeneklerinden hangilerinin gerçek hayatta daha verimli olduğunu anlatabildiği gibi, uygulamaların uygulama sürümlerini kontrol etmeyi düşünün. Aynı etikette olsa bile, https://developers.google.com/appengine/docs/python/tools/appstats –
her makale için yeni etiketler oluşturursunuz? 'A' seçeneği için giderdim çünkü her makale için aynı 'Tag'ı kullanabileceksiniz ve 'Articles' etiketine göre sorgulayabileceksiniz. – aschmid00
@PaulC teşekkürler. Aslında, appstats ile kontrol ettim ve benim durumumda B seçeneği daha verimli (1 yaz vs 2). Bununla birlikte, optimizasyon sadece küçük olduğundan, bire-bir ilişkiyi çözmek için belgelenmiş şekilde (yani seçenek A) vazgeçmeye değip değmeyeceğinden emin değilim. –