我正在尝试使用 2 个表执行查询:
CREATE TABLE users(
id_ UUID PRIMARY KEY,
username text,
email text,
);
CREATE TABLE users_by_email(
id UUID,
email text PRIMARY KEY
)
在这种情况下,如何通过电子邮件进行查询?
最佳答案
在上述情况下,我假设您专门尝试通过电子邮件检索用户名。
简答:
在 Cassandra 中,您无法使用您定义的表结构在单个查询中从电子邮件中获取用户名。您需要查询 users_by_email 以获取 ID,然后查询 users 以获取用户名。更好的选择是将用户名列添加到 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 数据建模类(class):
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;
关于database - cassandra - 如何执行表查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35551677/