0

這個問題看起來像一個開放式的問題。爲了使它更具體,讓我用一個示例場景來解釋。如何從關係數據庫的心態轉向應用程序引擎數據存儲?

假設運動員P1,P2,...,Pn參加球隊T1,T2,...,Tm。每年球隊都會對球員進行投標,因此球員會繼續改變球隊。

在關係數據庫中,玩家和團隊模式之間存在N對N關係。我們可以很容易地從關係數據庫中獲取以下信息: -

  1. 玩家P1在整個職業生涯中取得多少個進球?
  2. 球員P1在整個職業生涯中爲T1隊打入多少球?

在關係數據庫中,目標可能是N-N關係PlayerTeam的屬性。回答(1)只是一個聚合SUM查詢,(2)是一個簡單的選擇查詢。

我們如何組織Google App Engine數據存儲區中的團隊和玩家?以及如何在數據存儲中運行上面的查詢(1)和(2)?

回答

1

這裏有一個簡單,但可行的辦法:

import ndb 

class Player(ndb.model): 
    name = ndb.StringProperty(required=True) 
    # rest of Player model snipped 

class Team(ndb.model): 
    name = ndb.StringProperty(required=True) 
    # rest of Player model snipped 

class Goal(ndb.model): 
    player = ndb.KeyProperty(Player, required=True) 
    team = ndb.KeyProperty(Team, required=True) 

def playerNumGoals(player): 
    qry = Goal.query().filter(Goal.player == player.key()) 
    return qry.count() 

def playerTeamNumGoals(player, team): 
    qry = Goal.query().filter(Goal.player == player.key(), 
           Goal.team == team.key()) 
    return qry.count() 

所以,在此情況下非常不同於關係的辦法,除非你使用顯式的查詢,而不是連接。有了適當的指數,這只是相當的。

其他用例比較困難,可能需要進行更深層次的重構(通常是某種程度的去規範化)才能解決缺少連接的問題 - 在ndb中,就像其他任何NoSQL數據庫方法一樣。 ndb有它自己的額外的怪癖(例如,不能選擇某些屬性不同於23,但由不同的屬性排序),如果你處理令人印象深刻的數據質量,有時需要大量的聰明才智......

相關問題