【问题标题】:Designing/Using a user table in Cassandra with account creation在 Cassandra 中设计/使用用户表并创建帐户
【发布时间】:2013-02-22 04:49:04
【问题描述】:
我是 Cassandra 的新手,我开始设计一个简单的用户表,用于帐户注册和登录。这很简单:
行键:用户名;列:电子邮件、姓名、密码、盐。
或者:
行键:uuid;列:用户名、电子邮件、姓名、密码、盐。
关于这个简单的结构,我有两个问题:
- 我需要一个用于查找电子邮件(和用户名)的索引。我可以使用二级索引或手动创建索引。由于电子邮件/用户名列的基数很高,我应该选择第二个选项吗?显然二级索引适用于低基数列。
- 更重要的是,我立即遇到了同时向表中插入键的问题 - 我需要先读后写以确保用户名(或电子邮件)不在数据库中。有没有办法避免潜在的竞争条件(例如,两个用户同时注册相同的用户名/电子邮件)?还是使用额外的关系数据库来处理用户注册并将用户帐户详细信息复制到 cassandra 数据库以用于登录和其他目的的正确解决方案?
【问题讨论】:
标签:
database-design
cassandra
【解决方案1】:
是的,出于您陈述的原因,您需要创建自己的索引。电子邮件和用户名将是唯一的,因此不适合作为二级索引。
-
在任何需要唯一值的情况下,您都必须在写入之前读取。由于两个用户同时选择相同用户名的情况可能很少见(取决于您的流量),您可以交叉手指并希望它有效。或者,您可以按照以下流程进行操作:
- 执行读取以检查用户是否存在
- 如果不存在,写入记录并保留您使用的时间戳
- 再次读取用户并比较时间戳
- 如果时间戳不正确(暗示遵循相同流程的其他人覆盖了第一条记录),提示用户提供不同的名称
#2 中的流程会产生这样的效果,即在时间窗口内写入相同用户名的第二个用户将获胜,但我认为这没关系,只要您告诉至少一个用户该名称已被使用。