Рассмотрим следующий случай, связанный с базой данных 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')
Мое сомнение: будут ли данные находиться в одном разделе, чтобы можно было выполнить пакетную обработку?
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
за вас.
Похожие вопросы
Новые вопросы
database
База данных представляет собой организованный сбор данных. Это коллекция схем, таблиц, запросов, отчетов, представлений и других объектов. Данные обычно организованы так, чтобы моделировать аспекты реальности таким образом, чтобы поддерживать процессы, требующие информации. Используйте этот тег, если у вас есть вопросы о разработке базы данных. Если речь идет о конкретной системе управления базами данных (например, MySQL), используйте этот тег.