2014-10-21 4 views
1

Я создаю строковые идентификаторы хранилища данных для объекта «A» из автоматически генерируемых идентификаторов объекта «B.» Должен ли я префикс A ID «A-PREFIX» -B.IntID() или перейти с B.IntID() + «A-PREFIX?»?Compound Key Performance для App Engine Datastore

Предполагаю, что я должен начать с идентификатора B, потому что они равномерно распределены, чтобы предотвратить горячие точки?

От https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore

Anti-Pattern # 1: Последовательная нумерация сущностей Ключи

Спасибо, Andrew

ответ

3

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

Этот пример работает прекрасно (пример в Java):

Entity userEntity = new Entity("User"); 
Long id = datastore.put(userEntity).getId(); 

Entity loginEntity = new Entity("Login", id); 
datastore.put(loginEntity); 

Обратите внимание, что если вы берете Длинное идентификатор и преобразовать его в строку, ваши ключи будут занимать гораздо больше места. Поэтому использование Long для id - лучший вариант.

+0

Хорошая точка! Хотя, если у меня также был C, который имел тот же тип, что и A, и я хотел связать C с B, тогда мне нужно будет использовать строковый префикс, правильно? – Andrew

+2

Нет, вы можете просто ссылаться на B в сущности C как на свойство ('userEntity.setProperty (« users_relative », otherUserEntity.getKey(). GetId())) или сделать C дочерним объектом B. Я не могу думать любого прецедента, где необходим префикс. –

+0

Вы правы. Я мог просто хранить ключ B на C или наоборот, в зависимости от того, как мне нужно идти. Спасибо за совет. – Andrew