【发布时间】:2014-08-07 04:18:45
【问题描述】:
这更像是一个设计问题。
假设我有这张表(为了便于阅读,省略了大部分列):
CREATE TABLE IF NOT EXISTS users (
userid uuid,
emailaddress text,
passwordhash text,
passwordsalt text,
datecreated timestamp,
PRIMARY KEY (userid, emailaddress)
);
在这张表上,我有时需要通过 emailaddress 获取 userid,其他时候,只需使用 userid 获取其余值,因此查询是:
- 通过
emailaddress搜索,获取userid并在其他地方使用 - 按
userid搜索,获取特定用户的所有值并在其他地方使用。
仅通过 userid 查询有效,因为它是复合键表中的第一个键,但对于通过 emailaddress 查询(事先不知道用户 ID),我将不得不打开 ALLOW FILTERING,这是强烈不鼓励的.
问题是:知道这种设计在 Cassandra 的运行方式方面并不好,否则我将如何实现我的目标(通过 userid 或 emailaddress 获取用户详细信息)?我应该创建 2 个这样的表吗?
CREATE TABLE IF NOT EXISTS users (
userid uuid,
passwordhash text,
passwordsalt text,
datecreated timestamp,
PRIMARY KEY (userid)
);
CREATE TABLE IF NOT EXISTS useremails (
emailaddress text,
userid uuid,
PRIMARY KEY (emailaddress)
);
或者有没有更简洁的方法来实现我想做的事情?对于我对 Cassandra 的来龙去脉缺乏了解,我提前道歉。我仍在学习它并尝试从正确的角度解决问题,而不是破解(ALLOW FILTERING 允许我这样做)。
非常感谢,
【问题讨论】:
标签: cassandra