我仍在學習關於bigtable/nosql中的數據建模的經驗教訓,並希望得到一些反饋。 如果我經常需要與父母合計處理子女,那麼我應該在數據建模中避免父母與子女的關係是否公平?appengine python(bigtable)中的parent-> child關係
作爲一個例子,假設我正在構建一個博客,這個博客將由許多作者貢獻,並且彼此有帖子,每個帖子都有標籤。所以我可以設置這樣的東西:
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.StringListProperty()
據我所知,這將創建一個基於作者父母的實體組。 這是否會導致效率低下,如果我主要需要通過標籤查詢帖子,我希望這些標籤可以跨越多個作者?
我知道在列表屬性上執行查詢可能效率低下。假設每個帖子平均有大約3個標籤,但可以一直達到7個。我希望我的可能標籤收藏數量可以達到數百個。 將此模型改爲這樣的模型有什麼好處嗎?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.ListProperty(db.Key)
class Tag(db.Model):
name = db.StringProperty()
不然我就更好做這樣的事情?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
class Tag(db.Model):
name = db.StringProperty()
class PostTag(db.Model):
post = db.ReferenceProperty(Post,
collection_name='posts')
tag = db.ReferenceProperty(Tag,
collection_name='tags')
而最後一個問題......如果我的最常見的情況將被查詢的內容由多個標籤的帖子。例如,「在{'蘋果','橙子','黃瓜','自行車'}中查找標籤中的所有帖子。」其中一種方法更適合查找具有任何標籤集合的帖子的查詢?
謝謝,我知道這是一口。 :-)
您的示例都不會創建實體組。在第一個例子中,您使用了一個ReferenceProperty,它創建了對另一個實體的引用 - 這是可變的,並不意味着所有權。通過爲實體的構造函數指定「parent」參數來創建父引用 - 有關詳細信息,請參閱此頁:http://code.google.com/appengine/docs/python/datastore/entities.html#Entity_Groups_and_Ancestor_Paths –
啊,謝謝Nick。我錯過了那部分......認爲這是創建父關係的引用,並且缺少了需要將父項傳遞給構造函數的引用。這是有道理的。 –