2015-08-25 17 views
0

我想要有DB模式這樣的朋友系統:谷歌應用程序引擎 - 多個父/子

class Users(ndb.Model): 
    username = ndb.StringProperty(required = True) 
    bio = ndb.StringProperty() 

class friend_list(ndb.Model): 
    list = ndb.StringProperty(repeated=True) 

class friend_pending(ndb.Model): 
    list = ndb.StringProperty(repeated=True) 

friend_pending對朋友說,還沒有公認的模型。而friend_list是被接受的朋友模型。

我想讓friend_list和friend_pending都是Users實體的子項。可能嗎?

下面是第二種方法,如果它是不可能的:

class Users(ndb.Model): 
     username = ndb.StringProperty(required = True) 
     bio = ndb.StringProperty() 

    class friend_list(ndb.Model): 
     user_username = ndb.StringProperty(required = True) 
     list = ndb.StringProperty(repeated=True) 

    class friend_pending(ndb.Model): 
     user_username = ndb.StringProperty(required = True) 
     list = ndb.StringProperty(repeated=True) 

如果兩個都是可能的,這對成本和性能更好?

+0

查看[NDB數據存儲頁面](https://cloud.google.com/appengine/docs/python/ndb/),它解釋了父級關係,並提供了使用父級和查詢創建實體的示例代碼實體。 – ChrisC73

+0

@ ChrisC73雅,我已經讀過了。但是,我只是想澄清它。謝謝! –

回答

1

我想讓friend_list和friend_pending都是Users實體的子項。可能嗎?

是。在創建實體時,可以使用「父」參數爲實體指定一個父代(或多個父代)。

Google's Entity Keys該部分涵蓋了該井。

例子:

#Create User entity 
#This code assumes you're using GAE's built-in user's class 
user = users.User("[email protected]") 
user.put() 

#Create a friend list and set its parent to the user we create above 
friend_list = Friend_List(parent=user) 

#Save to datastore 
friend_list.put()​ 

請記住,在GAE的用戶類是專門定義的,你需要承認的附加功能。請參閱文檔here

如果兩者都可能,哪個更適合成本和性能?

我不能肯定地說,因爲我不知道你將如何使用這些模型,但在大多數情況下(也許是所有情況),你的第一種方法會更有效率。

最後,數據存儲模型的正確命名約定是首字母大寫。例如,你的朋友列表班應該是「Friend_List」。

+0

謝謝你的建議,是的,我只在stackoverflow中輸入這個模型代碼,所以我忘了把第一個字母大寫。無論如何,我認爲我會採取第一種方法。 –

+1

@ ahf90我的理解是一個實體可能只有一個父代。也許你打算說「祖先」? –