Предположим, у меня есть таблица пользователей в 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
UserPrincipal
иUserPrincipalByUsername
- разные таблицы? с другим первичным ключом? вы можете создать вторичный индекс наUserPrincipal
для запроса с использованием имени вместо его денормализации? - person Saravana   schedule 30.07.2016@Query
удовлетворит ваши потребности. Ваша работа - синхронизировать обе таблицы. Вы можете использовать атомарные пакетные операции, но это довольно дорого, поскольку они загружают ваши узлы Cassandra. Как насчет некоторого пакетного задания, которое выходит за рамки диапазона и отслеживает очистку / добавление недостающих данных? - person mp911de   schedule 31.07.2016