Как обновить несколько таблиц в Spring CassandraRepository

Предположим, у меня есть таблица пользователей в cassandra под названием «UserPrincipal», репозиторий будет выглядеть примерно так:

public interface UserRepository extends CassandraRepository<UserPrincipal> 
{
   @Query("SELECT * FROM UserPrincipal WHERE email = ?0")
   UserPrincipal findByEmailAddress(String emailAddress);   
}

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

public interface UserRepository extends CassandraRepository<UserPrincipal> 
{
   @Query("SELECT * FROM UserPrincipal WHERE email = ?0")
   UserPrincipal findByEmailAddress(String emailAddress);   

   @Query("SELECT * FROM UserPrincipalByUsername WHERE username= ?0")
   UserPrincipal findByUsername(String username);   
}

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

Я использую Cassandra 2.0.11, CQL spec 3.1.1, Spring data Cassandra 1.3.2 и Spring boot 1.3.1


person Hasson    schedule 30.07.2016    source источник
comment
UserPrincipal и UserPrincipalByUsername - разные таблицы? с другим первичным ключом? вы можете создать вторичный индекс на UserPrincipal для запроса с использованием имени вместо его денормализации?   -  person Saravana    schedule 30.07.2016
comment
На практике вы не можете использовать индекс cassandra для столбца с высокой мощностью, который имеет место для имени пользователя.   -  person Hasson    schedule 30.07.2016
comment
Использование @Query удовлетворит ваши потребности. Ваша работа - синхронизировать обе таблицы. Вы можете использовать атомарные пакетные операции, но это довольно дорого, поскольку они загружают ваши узлы Cassandra. Как насчет некоторого пакетного задания, которое выходит за рамки диапазона и отслеживает очистку / добавление недостающих данных?   -  person mp911de    schedule 31.07.2016
comment
Привет, @Hasson! Не могли бы вы рассказать нам, как вы это решили?   -  person Baga    schedule 21.12.2016
comment
@ Бага, пожалуйста, посмотри мой ответ   -  person Hasson    schedule 21.12.2016


Ответы (1)


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

person Hasson    schedule 21.12.2016