Компоновка базы данных AppEngine, которую легко расширить - PullRequest
0 голосов
/ 16 марта 2012

Мне нужна компоновка базы данных, которая легко расширяется.У меня есть суперкласс "станция", который будет иметь уникальный идентификатор и несколько атрибутов.

station {
    unique_identifier: id
    ...
}

большинство атрибутов выглядят так

station_attribute_item {
    referenced_station: id,
    value: double,
    date: date
}

Таким образом, вы можете визуализировать атрибут как элементсписка с датой и значением.

Таким образом, если мне нужен новый атрибут, я добавляю новый класс и все?Все, что мне нужно сделать, это запросить новый атрибут?

new_station_attribute {
    referenced_station: id
    value1: string
    value2: double
    start: date
    end: date
}

Отредактировано:

Возможно ли это расположение данных в инфраструктуре AppEngine?

1 Ответ

0 голосов
/ 18 марта 2012

То, что вы делаете, представляет собственность как отдельную сущность.Таким образом, вы получите несколько разных объектов, представляющих свойства (= атрибуты), которые ссылаются на родительский объект.

Это невозможно по следующим причинам:

  1. Выне сможет запросить сущность по нескольким свойствам.

  2. Если вы хотите атомарно изменить сущность или ее свойства (добавить / удалить сущность, добавить / удалить / изменить свойства), вам придется поместить их все в группу сущностей ииспользуйте транзакции.

  3. Вам нужно будет использовать запросы, чтобы найти свойства объекта, что является дорогостоящим.

  4. Когда вы удаляете объект, вам нужно будет вручную найти все объекты свойств и удалить их.

Итак, все в целомЯ не могу рекомендовать этот подход.

Решение:

GAE Datastore - это база данных без схемы, что означает, что вы можете хранить объекты одного типа с разными свойствами, например, иметь динамические свойства.Возникает проблема, как отобразить динамические свойства в классы.

В python вы можете достичь этого с помощью Expando class .

В Java вы можете использовать низкоуровневый класс сущностей .Низкоуровневый API-интерфейс является наиболее мощным, поскольку он предоставляет все функции хранилища данных, но его неудобно использовать при работе с классом Entity «без типа» вместо классов модели.

Objectify раньше имел встроенные карты, где вы добавляете свойства к этой карте, и они заканчиваются как свойства в объекте.Они обнаружили ошибку в реализации в Objectify 3.1 и отозвали эту функцию (= ушли из документации).Эта функция вернется в Objectify 4 , которая еще не выпущена, но вы можете построить ее из сундука, если вы чувствуете себя смелым.

...