Создание составного или составного ключа в Google App Engine

У меня есть две модели: 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)поскольку маловероятно, что у автомобиля будет много компаний, поэтому группа лиц не будет слишком большой.

Однако я не уверен, что делать с ключом филиала, поскольку у многих компаний может быть одно и то же название филиала, а во многих филиалах может быть одна и та же компания.

1 ответ

Решение

Вы правильно определили, что отношения предков в GAE не должны основываться на логической структуре ваших данных.

Они должны основываться на транзакционном поведении вашего приложения. Предки усложняют вашу жизнь. Например, когда вы используете составной ключ, вы не сможете получить эту сущность по ключу, если не знаете все элементы ключа. Если бы вы знали идентификатор автомобиля, вы бы не смогли получить его, не зная другого компонента.

Подумайте, для каких запросов вы должны иметь строгую согласованность. Если вам действительно нужна сильная согласованность при запросе всех автомобилей в данной ветке, то вам следует рассмотреть возможность использования этого в качестве предка.

Подумайте, какие операции необходимо выполнить в транзакции, это еще одна веская причина для использования группы объектов.

Помните также, что вам может вообще не понадобиться какая-либо группа сущностей (возможно, ответ для вашей ситуации).

Или, с другой стороны, вам может понадобиться группа сущностей, которая может не совсем соответствовать какой-либо логической концептуальной модели, но предком может быть сущность, которая существует исключительно для существования, потому что вам нужен предок для определенной транзакции.

Другие вопросы по тегам