Влияние миграции приложения из хранилища данных GAE M / S на HRD - PullRequest
0 голосов
/ 15 августа 2011

При переносе приложения из хранилища данных M / S в HRD есть определенные ловушки, которых следует избегать.У меня был вопрос об одной такой конкретной области, где говорится: «Идентификаторы сущностей одного и того же вида не всегда уникальны».

Чтобы объяснить это далее, приведу пример.

  1. Позвольте сказатьУ меня есть 3 объекта: Клиент, Контакт, Адрес, как показано ниже
  2. Ссылки на контактные лица Клиент использует ключ клиента как com.google.appengine.api.datastore.Key
  3. Адрес ссылки на объект Клиент использует ключ клиента какLong

3 класса:

public class Customer {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key id;

  @Persistent
  private String name;
}

public class Contact {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key id;

  @Persistent
  private String name;

  @Persistent
  private Key customerId;
}


public class Address {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key id;

  @Persistent
  private String address;

  @Persistent
  private Long customerId;
}

Все сущности являются корневыми сущностями.

Теперь, когда мы мигрируем, что произойдет с customerId в контакте и адресе лица?Будут ли они по-прежнему работать или нам нужно сделать что-то особенное перед миграцией?

Спасибо!

1 Ответ

1 голос
/ 15 августа 2011

То, что вы имеете в виду, связано с тем, как создаются ключи. Ключ сущности будет составлен из:

  • Ваш идентификатор приложения
  • Текущее пространство имен
  • Иерархия родителей (ей) <-- this allows ids to be non-unique within a kind
  • Доброе имя
  • Данный key_name ИЛИ id

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

Это означает, что все ваши корневые объекты, как определено, будут иметь уникальные идентификаторы / имена .

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

  1. Переосмыслите свой дизайн. Если вы ссылаетесь на сущности по идентификатору по группам сущностей, не имея / не имея родителя, вы могли применить группы сущностей там, где они не были нужны
  2. Вы можете allocateIds вручную на основе корневой версии Kind
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...