我正在尝试使用2个表执行查询:
CREATE TABLE users(
id_ UUID PRIMARY KEY,
username text,
email text,
);
CREATE TABLE users_by_email(
id UUID,
email text PRIMARY KEY
)
在这个cas中,如何通过电子邮件执行查询?
答案 0 :(得分:2)
我假设在上面的情况下,您特意尝试通过电子邮件检索用户名。
简答:
在Cassandra中,您无法使用您定义的表结构在单个查询中从电子邮件中获取用户名。您需要查询users_by_email以获取ID,然后查询用户以获取用户名。更好的选择是将用户名列添加到users_by_email表。
长答案:
由于Cassandra在磁盘上存储数据的基础机制,您在where子句中可能使用的唯一可用参数必须位于主键中。主键由2种不同类型的键组成。首先是分区键,用于物理分隔磁盘上的文件和集群中的节点之间的文件。第二个是群集密钥,用于组织存储在分区中的数据并有助于有效地检索数据。另一个需要注意的关键部分是,如果在查询中使用WHERE子句,则必须包含每个调用中的所有分区键。这是为了有效地检索数据。如果您想获得有关WHERE子句工作的更详细信息,请查看以下链接:
http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause
既然你知道WHERE子句的局限性是什么问题,我们如何绕过它们。首先要知道的是Cassandra不是RDBMS,你不能对表执行JOIN。这意味着我们需要忘记我们多年来学习的关于如何正确地规范化数据库中的数据并开始以不同方式思考问题的所有规则。通常,Cassandra是针对每个查询表模式而设计的。这意味着对于要运行的每个数据访问模式(即查询),存在一个关联表,其中包含该查询的数据,并具有适当的密钥以允许适当地过滤数据。我无法详细介绍如何正确地为您的数据建模数据,但我建议您在这里使用免费的Datastax Academy数据建模课程:
https://academy.datastax.com/courses/ds220-data-modeling
因此,我了解您的特殊需求,我认为您可以修改您的用户表,如下所示:
CREATE TABLE users_by_email(
email text,
username text,
id_ UUID,
PRIMARY KEY (email, username)
);
此表设置允许您使用以下查询通过电子邮件选择用户名:
SELECT username FROM users_by_email WHERE email=XXXXX;
答案 1 :(得分:1)
我假设您还希望在查询中返回username
。你不能在Cassandra加入桌子。为此,您必须将该列添加到users_by_email
表中:
CREATE TABLE users_by_email(
id UUID,
email text PRIMARY KEY,
username text,
);
然后,只需通过电子邮件地址查询该表。
> SELECT id, email, username FROM users_by_email WHERE email='mreynolds@serenity.com';
id | email | username
--------------------------------------+------------------------+----------
d8e57eb4-c837-4bd7-9fd7-855497861faf | mreynolds@serenity.com | Mal
(1 rows)