Проверка уникальности с помощью запроса в облачном хранилище в режиме хранилища данных - PullRequest
0 голосов
/ 02 октября 2019

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

https://cloud.google.com/datastore/docs/firestore-or-datastore#in_datastore_mode

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

Новое хранилище Google Cloud Firestore в режиме хранилища данных. Уточнение запросов

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

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

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

После некоторых исследований я могу собрать только следующее.

  1. Несмотря на то, что режим хранилища данных строго согласован, все еще невозможно использовать глобальные запросы в транзакциях.
  2. Какна https://cloud.google.com/datastore/docs/concepts/entities#creating_an_entity, можно использовать транзакцию, получить и на основе результата сделать ставку, но это возможно только при уникальности ключа.
  3. Есть несколько стратегий, обозначенных на В облачном хранилище данных Google хранится только уникальная сущность для этой же проблемы, и Дэн предложил «вставить», а не «положить». Сначала я этого не понял, так как в API Appengine Datastore никогда не было «Вставить». Но в клиентском API Cloud Datastore есть мутации, которые допускают явную вставку (в отличие от put, который сопоставляется с Upsert).
  4. В результате поддержки мутаций я мог использовать одну и ту же стратегию использования отдельной сущности (другойВид) с ключом, который сопоставляется с уникальным свойством (таким как электронная почта), но избегает дополнительного Get в транзакции. Я делаю tx.Mutate как на пользовательском объекте, так и на объекте отслеживания уникальности с Именным ключом в письме и пытаюсь вставить оба. Это приводит к ошибке AlreadyExists, которая может быть использована для отслеживания нарушения.
0 голосов
/ 04 октября 2019

На данный момент, нет способа обеспечить уникальность свойства . Тем не менее, есть обходные пути для того, что вы пытаетесь сделать. Один обходной путь описан в статье, приведенной выше, а другой - здесь .

...