GetOrCreate в RavenDB или лучшая альтернатива? - PullRequest
0 голосов
/ 27 февраля 2012

Я только начал использовать RavenDB в личном проекте, и до сих пор было очень легко реализовать вставку, обновление и запросы.Однако я столкнулся с ситуацией, когда мне нужен метод GetOrCreate, и мне интересно, каков наилучший способ добиться этого.

В частности, я интегрируюсь с OpenID, и после аутентификации пользователь перенаправляетсяна мой сайт.На этом этапе я либо хотел бы получить их пользовательскую запись из Raven (запросив свойство ClaimsIdentifier), либо создать новую запись.Идентификатор пользователя в настоящее время устанавливается Raven.

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

Есть ли способ достичь такого рода функциональности?Возможно, еще более важно, как вы думаете, я иду по неверному пути.Я предполагаю, что даже если бы я мог создать транзакцию, это затруднило бы масштабирование до нескольких серверов и в любом случае добавило бы «узкое место» производительности.

Лучше было бы использовать операции Query и Create какотдельные операторы и проверка на наличие дубликатов при извлечении пользователя и объединение в этой точке.Или сделать что-то похожее, но по запланированному заданию?

Не могу помочь, но чувствую, что упускаю что-то здесь очевидное, поэтому любые советы по этой проблеме будут с благодарностью приняты.Масштабирование до нескольких серверов может показаться небезопасным для личного проекта, я использую его для оценки Raven, прежде чем использовать его в работе.

1 Ответ

2 голосов
/ 27 февраля 2012

Дэн, хотя в RavenDB есть поддержка транзакций, я бы не пошел таким путем в вашем случае.Вместо этого вы можете просто использовать пользователей ClaimsIdentifier в качестве идентификатора документов пользователя, поскольку им предоставляется уникальность.

Кроме того, вы также можете остаться с идентификаторами пользователей, сгенерированными Raven (HiLo btw), и использовать новый UniqueConstraintsBundle, который позволяет вам приписывать определенные свойства уникальности.Внутренне он создаст дополнительный документ со значением вашего уникального свойства в качестве идентификатора.

...