我是Cassandra的新手,我开始设计一个简单的用户表来进行帐户注册和登录。这很简单:
行键:time();列:电子邮件,姓名,密码。
关于这个简单的结构,我提出了一个问题:
这里的行键是随机的。如何使用php使用电子邮件和密码登录?
答案 0 :(得分:2)
Cassandra采用基于查询的建模方法,因此您可以在单独的表中使用相同的冗余,非规范化数据......这没关系。你会想要继续保持这种想法。
注册和登录实际上是两个不同的东西,所以你想要将它们分开。从长远考虑查询和访问模式,从凭证数据中分离用户帐户数据可能是有意义的,因为凭据可能会发生变化。
CREATE TABLE users (
userid uuid,
firstname text,
lastname text,
email text,
created_date timestamp,
PRIMARY KEY (userid)
);
CREATE TABLE usercredentials (
email text,
password text,
userid uuid,
PRIMARY KEY (email)
);
这样,当用户更改密码时,它们不会影响整个users
表。此外,大多数用户更改其电子邮件的频率,偶尔删除(因此,生成的墓碑)不应该是一个大的交易。这将不允许SELECT * FROM usercredentials WHERE email=? AND password=?
查询起作用,因此您必须改为SELECT password FROM usercredentials WHERE email=?
,但这样可以消除旧密码闲置并导致潜在问题的可能性。您可以争论email
上的分区和password
上的群集,但这实际上没有意义,因为电子邮件一次永远不会有多个密码(尽管您可以设计一个类似的附加表存储密码历史记录)。
为了跟踪登录,我建议这样的事情:
CREATE TABLE logins (
time timestamp,
userid uuid,
email text,
PRIMARY KEY (userid, time)
);
这会通过userid
和time
的组合来关键行。这里的区别在于userid
是分区键,因此每个用户的所有登录都将存储在一起。 time
充当群集密钥,因此您可以对其执行ORDER BY
操作。 email
是此处的有效内容字段,这是有道理的,因为您可以看到它,同时还可以为可能已更改其电子邮件地址的用户无缝分组登录。这应该涵盖基础表格。
对于编码方面,CodeIgniter-PHPCassa项目可能对您有所帮助。