1
假设我有卡桑德拉称为“UserPrincipal” users表,该库将类似于以下如何更新春季CassandraRepository多个表
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);
}
可以指出的是,两个独立的接口可用于单独处理每个表,不过,我需要有一些逻辑保持在某个点的一致性。
我使用卡桑德拉2.0.11,CQL规范3.1.1,春数据卡桑德拉1.3.2和Spring 1.3.1启动
'UserPrincipal'和'UserPrincipalByUsername'是不同的表?用不同的主键?您可以在'UserPrincipal'上创建二级索引来使用名称进行查询,而不是对其进行反规范化处理? – Saravana
实际上,您不能将cassandra索引用于高基数列,这是用户名的情况。 – Hasson
使用'@ Query'可以满足您的需求。保持两个表同步是你的工作。您可以使用原子批处理操作,但这些操作非常昂贵,因为它们会使Cassandra节点处于繁忙状态。如何处理一些批量作业,并跟踪清理/添加缺失数据? – mp911de