2

我有兩種模式: Car(ndb.Model)和Branch(ndb.Model)每種都有一個關鍵方法。在谷歌應用程序引擎上創建複合鍵或複合鍵

@classmethod 
def car_key(cls, company_name, car_registration_id): 
    if not (company_name.isalnum() and car_registration_id.isalnum()): 
     raise ValueError("Company & car_registration_id must be alphanumeric") 
    key_name = company_name + "-" + car_registration_id 
    return ndb.Key("Car", key_name) 

分公司重點:

@classmethod 
def branch_key(cls, company_name, branch_name): 
    if not (company_name.isalnum() and branch_name.isalnum()): 
     raise ValueError("Company & Branch names must be alphanumeric") 
    key_name = company_name + "-" + branch_name 
    return ndb.Key("Branch", key_name) 

但是我想這是一個有點難看,而不是真正的你應該如何使用按鍵。

(汽車登記是汽車獨有的,但有時一家公司可能會將汽車出售給另一家公司,汽車也會在分支機構之間移動)。

由於公司可能有很多汽車或許多分支機構,我想我不想要大型實體組,因爲每秒只能寫入一個實體組。

我該如何定義我的密鑰?

例如我正在考慮car_key = ndb.Key("Car", car_reg_id, "Company", company_name) ,因爲汽車不太可能有很多公司,所以實體組不會太大。

但是我不知道該如何處理分支關鍵字,因爲許多公司可能具有相同的分支名稱,並且許多分支可能具有相同的公司。

回答

3

您已正確地確定GAE中的祖先關係不應基於數據的邏輯結構。

他們需要基於您的應用程序的交易行爲。祖先讓你的生活變得艱難。例如,一旦使用複合鍵,除非您碰巧知道鍵的所有元素,否則您將無法通過鍵獲取該實體。如果您知道Car ID,則在不知道其他組件的情況下無法獲取它。

考慮您需要哪些查詢具有較強的一致性。如果您在查詢給定分支中的所有汽車時碰巧需要很強的一致性,那麼您應該考慮將其用作祖先。

考慮在交易中需要完成哪些操作,這是使用實體組的另一個好理由。

請記住,您可能根本不需要任何實體組(可能是您的情況的答案)。另一方面,您可能需要一個可能不完全適合任何邏輯概念模型的實體組,但祖先可能是純粹存在的實體,因爲您需要某個事務的祖先。

+0

謝謝。我總是知道與登錄用戶帳戶關聯的公司名稱和分支名稱。因此,我認爲我會保持原樣(兩個字符串以中間的「 - 」連接)。我將爲每個分支創建一個汽車註冊ID列表。這將提供一種方式來查看相關的汽車,然後點擊「編輯汽車」,它將被給予註冊ID。 – 2013-05-14 04:29:35