【问题标题】:creating a compound or composite key on google app engine在谷歌应用引擎上创建复合键或复合键
【发布时间】:2013-05-14 02:34:24
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 谢谢。我总是知道与登录用户帐户相关联的公司名称和分支机构名称。我想因此我会保持原样(两个字符串中间用“-”连接)。我将为每个分支创建一个汽车注册 ID 列表。这将提供一种查看相关汽车的方法,然后单击“编辑汽车”,它将获得注册 ID。
    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多