2013-02-21 103 views
1

我是Cassandra的新手,我开始设计一个简单的用户表进行帐户注册和登录。这很简单:在Cassandra中设计/使用用户表并创建帐户

行键:用户名;栏目:电子邮件,名称,密码,盐。
或者:
行键:uuid;列:用户名,电子邮件,名称,密码,盐。

对此结构简单,我有两个问题:

  1. 我需要的电子邮件(和用户名)查找索引。我可以使用辅助索引或手动创建索引。我应该选择第二个选项,因为电子邮件/用户名列的基数很高吗?显然,二级索引适用于低基数列。
  2. 更重要的是,我立即遇到了同时向表中插入密钥的问题 - 我需要进行先读后写,以确保用户名(或电子邮件)不在数据库中。有没有办法避免潜在的竞争条件(例如,两个用户同时注册相同的用户名/电子邮件)?还是使用其他关系数据库处理用户注册并将用户帐户详细信息复制到cassandra数据库以进行登录和其他用途的正确解决方案?

回答

2
  1. 是的,你需要创建自己的索引,你说明理由。电子邮件和用户名将是唯一的,因此是二级索引的不良候选者。

  2. 在任何情况下需要一个独特的值,你必须在写之前阅读。由于两个用户同时选择相同用户名的情况可能很罕见(取决于您的流量),您可能只是交叉手指并希望它能正常工作。或者您也可以按照这个流程:

    • 做一个读来检查用户的存在
    • 如果它不存在,写入记录并紧紧抓住你使用
    • 时间戳再次阅读用户和比较时间戳
    • 如果时间戳不正确(这意味着别人相同的流量下改写的第一条记录),提示用户提供一个不同的名称

#2中的流程将会影响第二个用户在时间窗口内写入相同的用户名将会获胜,但我认为这是可以的,只要您告诉至少一个用户名称已被占用。