cassandra - 如何执行 table 查询?
cassandra - how to perform table query?
我正在尝试使用 2 个表执行查询:
CREATE TABLE users(
id_ UUID PRIMARY KEY,
username text,
email text,
);
CREATE TABLE users_by_email(
id UUID,
email text PRIMARY KEY
)
在这种情况下,如何通过电子邮件进行查询?
我假设您还希望在查询中返回 username
。您不能在 Cassandra 中加入 tables。因此,要做到这一点,您必须将该列添加到您的 users_by_email
table:
CREATE TABLE users_by_email(
id UUID,
email text PRIMARY KEY,
username text,
);
然后,只需通过电子邮件地址查询 table。
> 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)
在上述情况下,我假设您专门尝试通过电子邮件检索用户名。
简答:
在 Cassandra 中,您无法使用您定义的 table 结构在单个查询中从电子邮件中获取用户名。您需要查询 users_by_email 以获取 ID,然后查询用户以获取用户名。更好的选择是将用户名列添加到 users_by_email table.
长答案:
由于 Cassandra 将数据存储在磁盘上的底层机制,您可以在 where 子句中使用的唯一可用参数必须在主键中。主键由 2 种不同类型的键组成。首先是分区键,用于在磁盘上和集群中的节点之间物理分隔文件。其次是簇键,用于组织存储在分区中的数据并有助于高效检索数据。另一个需要注意的关键部分是,如果您在查询中使用 WHERE 子句,它必须包含每次调用的所有分区键。这是为了允许高效检索数据。如果您想获得有关 WHERE 子句工作的更多详细信息,请查看此 link:
http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause
既然您知道了 WHERE 子句的局限性,那么问题就是我们如何绕过这些局限性。您需要知道的第一件事是 Cassandra 不是 RDBMS,您不能对 tables 执行 JOIN。这意味着我们需要忘记我们多年来学到的关于如何正确规范数据库中数据的所有规则,并开始以不同的方式思考问题。一般来说,Cassandra 是为 table-per-query 模式设计的。这意味着对于每个数据访问模式(即查询),您将 运行 反对有一个关联的 table 包含该查询的数据并具有适当的键以允许过滤数据适当地。我无法深入探讨如何正确地对数据进行数据建模的所有细节,但我建议您参加此处提供的免费 Datastax 学院数据建模课程:
https://academy.datastax.com/courses/ds220-data-modeling
据我了解您的特殊需求,我认为您可以将用户 table 修改为如下所示:
CREATE TABLE users_by_email(
email text,
username text,
id_ UUID,
PRIMARY KEY (email, username)
);
此 table 设置将允许您 select 通过电子邮件使用以下查询的用户名:
SELECT username FROM users_by_email WHERE email=XXXXX;
我正在尝试使用 2 个表执行查询:
CREATE TABLE users(
id_ UUID PRIMARY KEY,
username text,
email text,
);
CREATE TABLE users_by_email(
id UUID,
email text PRIMARY KEY
)
在这种情况下,如何通过电子邮件进行查询?
我假设您还希望在查询中返回 username
。您不能在 Cassandra 中加入 tables。因此,要做到这一点,您必须将该列添加到您的 users_by_email
table:
CREATE TABLE users_by_email(
id UUID,
email text PRIMARY KEY,
username text,
);
然后,只需通过电子邮件地址查询 table。
> 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)
在上述情况下,我假设您专门尝试通过电子邮件检索用户名。
简答:
在 Cassandra 中,您无法使用您定义的 table 结构在单个查询中从电子邮件中获取用户名。您需要查询 users_by_email 以获取 ID,然后查询用户以获取用户名。更好的选择是将用户名列添加到 users_by_email table.
长答案:
由于 Cassandra 将数据存储在磁盘上的底层机制,您可以在 where 子句中使用的唯一可用参数必须在主键中。主键由 2 种不同类型的键组成。首先是分区键,用于在磁盘上和集群中的节点之间物理分隔文件。其次是簇键,用于组织存储在分区中的数据并有助于高效检索数据。另一个需要注意的关键部分是,如果您在查询中使用 WHERE 子句,它必须包含每次调用的所有分区键。这是为了允许高效检索数据。如果您想获得有关 WHERE 子句工作的更多详细信息,请查看此 link:
http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause
既然您知道了 WHERE 子句的局限性,那么问题就是我们如何绕过这些局限性。您需要知道的第一件事是 Cassandra 不是 RDBMS,您不能对 tables 执行 JOIN。这意味着我们需要忘记我们多年来学到的关于如何正确规范数据库中数据的所有规则,并开始以不同的方式思考问题。一般来说,Cassandra 是为 table-per-query 模式设计的。这意味着对于每个数据访问模式(即查询),您将 运行 反对有一个关联的 table 包含该查询的数据并具有适当的键以允许过滤数据适当地。我无法深入探讨如何正确地对数据进行数据建模的所有细节,但我建议您参加此处提供的免费 Datastax 学院数据建模课程:
https://academy.datastax.com/courses/ds220-data-modeling
据我了解您的特殊需求,我认为您可以将用户 table 修改为如下所示:
CREATE TABLE users_by_email(
email text,
username text,
id_ UUID,
PRIMARY KEY (email, username)
);
此 table 设置将允许您 select 通过电子邮件使用以下查询的用户名:
SELECT username FROM users_by_email WHERE email=XXXXX;