Рассмотрим следующий случай, связанный с базой данных Cassandra: я должен выполнить пакетный оператор с некоторыми связанными данными, например: таблица users и таблица users_by_username. Я хочу вставить данные о создании пользователя в обе таблицы. Это сделка. В документации Cassandra говорится, что пакетный оператор не может достичь нескольких разделов. Если я моделирую первичный ключ как составной ключ, как показано ниже:

CREATE TABLE IF NOT EXISTS user(
  id text,
  tpe text,
  username text,
  PRIMARY KEY((tpe, id))
);

CREATE TABLE IF NOT EXISTS user_by_username(
  username text,
  tpe text,
  id text,
  PRIMARY KEY((tpe, username))
);

Пример строк:

Пользователь: ('1', 'пользователи', 'lucasrpb') имя_пользователя: ('lucasrpb', 'пользователи', '1')

Мое сомнение: будут ли данные находиться в одном разделе, чтобы можно было выполнить пакетную обработку?

2
Lucas Batistussi 8 Июл 2016 в 03:12

1 ответ

Лучший ответ

Разделы находятся внутри таблицы, а не между таблицами. Однако токен для данных, который используется для определения реплик, на которых будут размещены данные, основан на ключе раздела (первый столбец в первичном ключе или первый столбец (ы) в круглых скобках).

В вашем случае ключ раздела для "пользователя" - (tpe, id), а user_by_username - (tpe, username). Из-за этого токен для данных, скорее всего, не будет таким же.

Если первичный ключ для user был (tpe, id), user_by_username (tpe, username), ключ раздела для каждого случая был бы tpe, поэтому Если tpe был таким же, токен будет таким же, и, следовательно, данные будут храниться на тех же репликах.

В любом случае я бы не рекомендовал группировать операции для обновления user_by_username и user вместе, но было бы лучше в случае, если ключ раздела был таким же, как и меньше узлов C * в партии.

Поскольку единственное различие между вашими таблицами - это ваш первичный ключ, я думаю, что для вас хорошим кандидатом, если вы используете версию 3.0+, было бы заглянуть в материализованные представления, представленные в версии 3.0. С его помощью вы можете настроить просмотр user_by_username таблицы user, например:

CREATE MATERIALIZED VIEW user_by_username AS 
SELECT * FROM users 
WHERE username IS NOT NULL
PRIMARY KEY ((tpe, username));

Таким образом, вам нужно только внести изменения в user, которые затем будут перенесены на user_by_username за вас.

2
Andy Tolbert 8 Июл 2016 в 03:24
1
Сколько бы это стоило?
 – 
Lucas Batistussi
8 Июл 2016 в 03:34
1
Стоимость материализованных просмотров? Вопросы производительности хорошо задокументированы здесь: datastax. ru / dev / blog /…
 – 
Andy Tolbert
8 Июл 2016 в 04:23