cassandra - как выполнить запрос к таблице?

Я пытаюсь выполнить запрос, используя 2 таблицы:

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

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

В этом случае, как выполнить запрос по электронной почте?


person farhawa    schedule 22.02.2016    source источник
comment
Основываясь на предоставленной вами структуре таблицы, я чувствую, что таблица пользователей также будет иметь уникальную электронную почту. так почему бы не использовать его в качестве первичного ключа в таблице пользователей?   -  person undefined_variable    schedule 22.02.2016
comment
Вероятно, потому что адреса электронной почты могут меняться.   -  person Aaron    schedule 22.02.2016


Ответы (2)


Я предполагаю, что вы также хотите, чтобы 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)
person Aaron    schedule 22.02.2016

Я предполагаю, что в приведенном выше случае вы специально пытаетесь получить имя пользователя по электронной почте.

Короткий ответ:

В Cassandra вы не сможете получить имя пользователя из электронной почты в одном запросе, используя определенную вами структуру таблицы. Вам нужно будет запросить users_by_email, чтобы получить идентификатор, а затем запросить пользователей, чтобы получить имя пользователя. Лучшим вариантом было бы добавить столбец имени пользователя в таблицу users_by_email.

Длинный ответ:

Из-за базовых механизмов, с помощью которых Cassandra хранит данные на диске, единственные доступные параметры, которые вы можете использовать в предложении where, должны быть в основном ключе. Первичный ключ состоит из двух разных типов ключей. Во-первых, это ключ раздела, который используется для физического разделения файлов на диске и между узлами в кластере. Во-вторых, ключи кластера, которые используются для организации данных, хранящихся в разделе, и помогают в эффективном извлечении данных. Еще одна важная часть, которую следует отметить, заключается в том, что если вы используете предложение 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;
person bechbd    schedule 22.02.2016