2012-01-13 138 views
0

我想要一個父級班(Group),其中任何數量的用戶都可以加入。我想顯示用戶尚不在的所有組。我如何對這些數據建模,以及如何查詢?對不起,沒有提供任何代碼,但我根本不知道。GQL - 選擇所有父母特定孩子不在兒童中

編輯: 在SQL中,這將通過用戶表,組表和GroupUser交叉表完成。和查詢會去:

select * 
from Group 
where Group.ID not in 
(
select GroupID 
from GroupUser 
where UserID = @userid 
) 
+0

GQL不能做到這一點。 (這也不是親子關係,但這只是您的術語問題,並不影響實際功能。) – geoffspear 2012-01-13 20:57:28

+0

那麼請嘗試超越術語並提出解決方案。這種關係在現實中很常見。 – Landrew 2012-01-13 21:06:11

+0

你期望有多少組?您可以爲每個用戶存儲一個組列表,並將其與所有組的列表進行比較,但這並不能很好地擴展。 – geoffspear 2012-01-13 21:07:45

回答

0

也許我不明確地提出我的問題,我顯然是GAE的新手,我的術語可能是錯誤的。反正這裏是我的解決方案:

class User(db.Model): 
    username = db.StringProperty() 

class Group(db.Model): 
    users = db.ListProperty(db.Key) 

要查找一組,並加入(有些簡化):

groups = db.GqlQuery("SELECT * " 
        "FROM Group")   

for g in groups:     
    if user.key() not in g.users:      
     group = g 
     break 

group.users.append(user.key()) 
0

將會有成千上萬的組和用戶將成爲他們的幾十個成員?

您將遇到用戶體驗問題:您如何讓用戶從數千個組中選擇?有50多頁的分頁表?

關於你的問題:當你解決以上問題,那麼你可以正確標記組的用戶已經是一個成員:

你可以簡單的在內存中的所有用戶羣體(這是隻有十的ID,對不對? ),並在顯示組時簡單地過濾它們。

+0

Knego,謝謝。沒關係用戶體驗。 Group/User示例只是一個示例。實際上,後端會自動將用戶分配到他們不是成員的「組」。你能用一些代碼示例來開發你的建議解決方案嗎? – Landrew 2012-01-14 08:58:42

+0

隨機挑選組,如果用戶還不是會員(組員爲1:1000的機會很小),請將他添加到組中。如果是會員,請重複。 – 2012-01-14 09:34:32

0

正如Wooble所說,沒有辦法爲App Engine數據存儲構建像這樣的查詢。如果你的組數大大超過了用戶實際所在的組數,你最好的選擇就是選擇所有的組,然後過濾出用戶已經在的組 - 這正是SQL數據庫給出的查詢的功能。

相關問題