在Cassandra中设计/使用用户表来创建和登录帐户

时间:2014-10-06 13:55:55

标签: php cassandra

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

行键:time();列:电子邮件,姓名,密码。

关于这个简单的结构,我提出了一个问题:

这里的行键是随机的。如何使用php使用电子邮件和密码登录?

1 个答案:

答案 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)
);

这会通过useridtime的组合来关键行。这里的区别在于userid是分区键,因此每个用户的所有登录都将存储在一起。 time充当群集密钥,因此您可以对其执行ORDER BY操作。 email是此处的有效内容字段,这是有道理的,因为您可以看到它,同时还可以为可能已更改其电子邮件地址的用户无缝分组登录。这应该涵盖基础表格。

对于编码方面,CodeIgniter-PHPCassa项目可能对您有所帮助。