在Google应用引擎上创建复合键或复合键

时间:2013-05-14 02:34:25

标签: google-app-engine composite-key app-engine-ndb compound-key entity-groups

我有两个型号: 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)

但是我觉得这有点难看,而不是你应该如何使用密钥。

(汽车注册是汽车独有的,但有时一家公司可能会将汽车卖给另一家公司,而且汽车也会在不同的汽车之间移动。)

由于公司可能有很多车或许多分支,我想我不想要大型实体组,因为你每秒只能写一个实体组一次。

我该如何定义我的钥匙?

e.g。我在考虑car_key = ndb.Key("Car", car_reg_id, "Company", company_name) 因为汽车不太可能有很多公司所以实体组不会太大。

但是我不知道如何处理分支机构密钥,因为许多公司可能拥有相同的分支机构名称,而且许多分支机构可能拥有相同的分支机构。

1 个答案:

答案 0 :(得分:3)

您已正确地确定GAE中的祖先关系不应基于数据的逻辑结构。

它们需要基于应用程序的事务行为。祖先让你的生活变得艰难。例如,一旦使用复合键,除非您碰巧知道键的所有元素,否则您将无法通过键获取该实体。如果您知道Car id,那么在不知道其他组件的情况下,您将无法获取它。

考虑一下您需要具备强一致性的查询。如果在查询给定分支中的所有汽车时确实需要强一致性,那么您应该考虑将其用作祖先。

考虑在事务中需要执行哪些操作,这是使用实体组的另一个好理由。

请记住,您可能根本不需要任何实体组(可能是您的情况的答案)。

或者,另一方面,您可能需要一个可能不完全适合任何逻辑概念模型的实体组,但祖先可能是纯粹存在的实体,因为您需要一个特定事务的祖先。