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