在谷歌应用引擎上创建一个复合或复合键



我有两个模型:Car(ndb.Model)和Branch(ndb.Model)各有一个key方法。

@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)因为一辆车不太可能有很多公司,所以实体组不会太大。

但是我不确定如何处理分支键,因为许多公司可能有相同的分支名称,而许多分支可能有相同的公司。

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

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

考虑哪些查询需要强一致性。如果你在查询给定分支中的所有汽车时碰巧需要强一致性,那么你应该考虑使用它作为祖先。

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

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

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

相关内容

最新更新