2016-02-22 20 views
1

我想执行使用2个表的查询:cassandra - 如何执行表查询?

CREATE TABLE users(
    id_ UUID PRIMARY KEY, 
    username text, 
    email text, 
); 

CREATE TABLE users_by_email(
    id UUID, 
    email text PRIMARY KEY 
) 

在这种CAS,如何执行电子邮件查询?

+0

基于您提供的表结构,我觉得用户表也将具有唯一的电子邮件。所以为什么不把它作为用户表中的主键? –

+0

可能因为电子邮件地址可能会更改。 – Aaron

回答

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='[email protected]'; 

id         | email     | username 
--------------------------------------+------------------------+---------- 
d8e57eb4-c837-4bd7-9fd7-855497861faf | [email protected] |  Mal 

(1 rows) 
2

我假设在上面的情况下,您是专门试图通过电子邮件检索用户名。

答案很简单:

有一个在卡桑德拉没有办法,你将能够获得来自电子邮件的用户名,使用已定义的表结构单一的查询。您需要查询users_by_email以获取该id,然后查询用户以获取用户名。更好的选择是将用户名列添加到users_by_email表。

龙答:

由于其在磁盘上的卡桑德拉存储数据的唯一可用的参数,您可以在where子句必须在主键使用的基本机制。主键由2种不同类型的键组成。首先是分区密钥,用于物理分隔磁盘上的文件和群集中的节点之间的文件。其次是集群密钥,用于组织存储在分区中的数据,并有助于高效地检索数据。另一个需要注意的关键部分是,如果在查询中使用WHERE子句,则每次调用都必须包含其中的所有分区键。这是为了有效地检索数据。如果你想在WHERE子句的工作的一些更详细的信息,看看这个链接:

http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

现在你知道什么WHERE子句是问题的局限性,我们如何绕过他们。首先你需要知道的是Cassandra不是一个RDBMS,你不能对表执行JOIN。这意味着我们需要忘记我们多年来所学习的所有规则,即如何正确地对数据库中的数据进行标准化,并开始思考问题。一般来说,Cassandra是为每个查询表而设计的。这意味着对于每个要访问的数据访问模式(即查询),将运行一个关联表,其中包含该查询的数据并具有适当的键以允许适当地过滤数据。我不会是能够进入的所有细节问题细节如​​何正确数据模型的数据,但我建议你乘坐免费Datastax研究院数据建模过程avaliable这里:

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;