我有一个userId作为主键的用户表(列族),它还有其他详细信息,如emailId,密码,用户名等。
我怀疑当用户使用emailId登录时,如何在表中查找密码,因为我的主键是userId而不是emailId?
或者创建emailId是主键更好吗?
或用于将userId与emailId映射的附加表?
答案 0 :(得分:1)
假设您的Cassandra版本支持Materialized View(3.x),这里可以轻松完成
假设您的原始表架构如下,其中userId是主键
create table userdetails_by_id
(userId text primary key,
emailId text,
password text,
username text);
创建一个物化视图,其中emailId将成为主键,并包含主表中的所有其他字段。这是它的定义
create materialized view userdetails_by_emailid
as select
userId,
emailId,
password,
username
from userdetails_by_id
where userId is not null and emailId is not null
primary key (emailId, userId);
现在,当查询针对userId时,您可以将其路由到主表,并且可以将针对emailId的查询路由到物化视图。这样Cassandra将保持数据同步,并且维护两个表不需要额外的应用程序代码。
答案 1 :(得分:0)
创建其他映射表(emailId到userId)需要您查询两个表。这违背了Cassandra的设计原则。尝试减少需要触发的查询。在您的情况下,有必要使用emailId作为PRIMARY KEY的表。