2015-12-08 2 views
0

Я новичок в Google Datastore, поэтому, пожалуйста, со мной. Я не хочу, чтобы создать сгенерированный ключ для моих сущностей, так что я указать свой:Ключ против ID/Имя?

Entity employee = Entity.newBuilder().setKey(makeKey("Employee", "bobby")) 
     .addProperty(makeProperty("fname", makeValue("fname").setIndexed(false))) 
     .addProperty(makeProperty("lname", makeValue("lname").setIndexed(false)))  
     .build(); 

CommitRequest request = CommitRequest.newBuilder() 
    .setMode(CommitRequest.Mode.NON_TRANSACTIONAL) 
    .setMutation(Mutation.newBuilder().addInsert(employee)) 
    .build(); 
datastore.commit(request); 

Когда я проверяю, чтобы видеть то, что объект выглядит, как он выглядит следующим образом:

enter image description here

Почему это автоматически сгенерированный ключ, если я указал свой собственный ключ (bobby)? Кажется, бобби тоже было создано, но теперь у меня есть бобби и этот автогенерированный ключ. В чем разница между ключом и id/name?

ответ

2

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

+0

Спасибо. Теперь очень ясно! – user2924127

1

Что вы создаете с помощью makeKey("Employee", "bobby") - это ключ для лица с именем объекта Employee и именем bobby. То, что вы видите как «Ключ» в средстве просмотра хранилища данных, представляет собой представление именно для этого.

Вообще ключ всегда состоит из

  • необязательного родительского ключа (с типом объекта и имя/идентификатор)
  • типа сущности
  • имя сущности/ид

Возможно кто-то здесь может рассказать вам, как декодировать ключ в своих компонентах, но отдыхать при условии, что вы делаете все правильно, и поведение будет таким, как ожидалось.

3

Вы не можете указать свой собственный ключ, на самом деле клавиши содержат информацию, необходимую для работы хранилища данных. Эта заметка в the documentation дает вам представление:

Примечание. Строка, защищенная URL-адресом, выглядит загадочной, но она не зашифрована! Он может быть легко декодируются для восстановления доброго и идентификатора исходного лица:

key = Key(urlsafe=url_string) 
kind_string = key.kind() 
ident = key.id() 

Если вы используете такие URL безопасных ключей, не используйте конфиденциальные данные, такие как электронная почта адреса в качестве идентификаторов сущностей. (Возможным решением было бы использовать хеш MD5 чувствительных данных в качестве идентификатора. Это останавливает третьи стороны , которые могут видеть зашифрованные ключи, используя их для сбора адресов электронной почты , хотя это не мешает им независимо генерируя свой собственный хэш известного адреса электронной почты и использовать его для проверки, присутствует ли в хранилище данных, что адрес.)

что you can specify является ID части ключа, либо в виде числа или как строка:

Ключ - это серия пар идентификаторов вида. Вы хотите убедиться, что каждый объект имеет ключ, уникальный в своем приложении и пространстве имен. Приложение может создать объект без указания идентификатора; Datastore автоматически генерирует числовой идентификатор.Если приложение выбирает некоторые идентификаторы «вручную», и они являются числовыми, и приложение позволяет Datastore генерировать некоторые идентификаторы автоматически, Datastore может выбрать некоторые идентификаторы, которые уже использовало приложение. Чтобы избежать этого, приложение должно «зарезервировать» диапазон номеров, которые он будет использовать для , для выбора идентификаторов (или используйте идентификаторы строк, чтобы избежать этой проблемы полностью).

Смежные вопросы