使用帐户创建在Cassandra中设计/使用用户表

时间:2013-02-21 17:20:20

标签: database-design cassandra

我是Cassandra的新手,我开始设计一个简单的用户表来进行帐户注册和登录。这很简单:

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

关于这个简单的结构,我有两个问题:

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

1 个答案:

答案 0 :(得分:2)

  1. 是的,您需要根据您说明的原因创建自己的索引。电子邮件和用户名将是唯一的,因此不适合作为二级索引。

  2. 在任何需要唯一值的情况下,您必须在写入之前阅读。由于两个用户同时选择相同用户名的情况可能很少(取决于您的流量),您可以只是交叉手指并希望它有效。或者,您可以遵循以下流程:

    • 执行阅读以检查用户是否存在
    • 如果它不存在,请写下记录并按住您使用的时间戳
    • 再次阅读用户并比较时间戳
    • 如果时间戳不正确(暗示跟随相同流程的其他人覆盖了第一条记录),则提示用户提供其他名称
  3. #2中的流量将导致第二个用户在时间窗口内写入相同的用户名将获胜,但我认为只要您告诉至少一个用户该名称已被占用就可以了。< / p>