Разница между ключом раздела, составным ключом и ключом кластеризации в Cassandra?

Я читаю статьи по сети, чтобы понять различия между следующими key типами. Но мне просто трудно понять. Примеры, безусловно, помогут лучше понять понимание.

 primary key, partition key, composite key clustering key 

В этом есть много путаницы, я постараюсь сделать это как можно проще.

Первичный ключ – это общая концепция, указывающая один или несколько столбцов, используемых для извлечения данных из таблицы.

Первичный ключ может быть SIMPLE и даже объявлен inline:

  create table stackoverflow_simple ( key text PRIMARY KEY, data text ); 

Это означает, что он сделан одним столбцом.

Но первичный ключ также может быть COMPOSITE (иначе COMPOUND ), созданный из большего количества столбцов.

  create table stackoverflow_composite ( key_part_one text, key_part_two int, data text, PRIMARY KEY(key_part_one, key_part_two) ); 

В ситуации с первичным ключом COMPOSITE «первая часть» ключа называется PARTITION KEY (в этом примере key_part_one является ключом раздела), а вторая часть ключа – КЛАСТЕРНЫЙ КЛЮЧ (в этом примере key_part_two )

Обратите внимание, что оба раздела и кластеризация могут быть сделаны из большего количества столбцов , вот как это сделать:

  create table stackoverflow_multiple ( k_part_one text, k_part_two int, k_clust_one text, k_clust_two int, k_clust_three uuid, data text, PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three) ); 

За этими именами …

  • Ключ раздела отвечает за распределение данных по вашим узлам.
  • Кластер Clustering отвечает за сортировку данных в разделе.
  • Первичный ключ эквивалентен Ключу раздела в таблице с одним полем (т. Е. Simple ).
  • Компонентный / составной ключ – это всего лишь несколько столбцов

Дополнительная информация об использовании: DATASTAX DOCUMENTATION


Небольшие примеры использования и контента
ПРОСТОЙ КЛЮЧ:

 insert into stackoverflow_simple (key, data) VALUES ('han', 'solo'); select * from stackoverflow_simple where key='han'; 

содержимое таблицы

 key | data ----+------ han | solo 

COMPOSITE / COMPOUND KEY может извлекать «широкие строки» (т.е. вы можете запросить только ключ раздела, даже если у вас есть ключи кластеризации)

 insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player'); insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player'); select * from stackoverflow_composite where key_part_one = 'ronaldo'; 

содержимое таблицы

  key_part_one | key_part_two | data --------------+--------------+-------------------- ronaldo | 9 | football player ronaldo | 10 | ex-football player 

Но вы можете запросить все ключи (как для раздела, так и для кластеризации) …

 select * from stackoverflow_composite where key_part_one = 'ronaldo' and key_part_two = 10; 

вывод запроса

  key_part_one | key_part_two | data --------------+--------------+-------------------- ronaldo | 10 | ex-football player 

Важное примечание: ключ раздела является минимальным спецификатором, необходимым для выполнения запроса с использованием предложения where clause . Если у вас есть составной ключ раздела, например следующий

например: PRIMARY KEY((col1, col2), col10, col4))

Вы можете выполнять запрос только, передавая как минимум как col1, так и col2, это 2 столбца, которые определяют ключ раздела. «Общее» правило для запроса состоит в том, что вам необходимо передать хотя бы все столбцы ключей раздела, затем вы можете добавить опционально каждый ключ кластера в том порядке, в котором они установлены.

поэтому действительные запросы ( исключая вторичные индексы )

  • col1 и col2
  • col1 и col2 и col10
  • col1 и col2 и col10 и col4

Инвалид:

  • col1 и col2 и col4
  • все, что не содержит как col1, так и col2

Надеюсь это поможет.

Добавление ответа redux в качестве принятого достаточно велико. Термины «строка» и «столбец» используются в контексте CQL, а не как фактически реализована Cassandra.

  • Первичный ключ уникально идентифицирует строку.
  • Совокупный ключ – это ключ, сформированный из нескольких столбцов.
  • Ключ раздела – это первичный поиск, чтобы найти набор строк, т. Е. Раздел.
  • Клавиша кластеризации является частью первичного ключа, который не является ключом раздела (и определяет порядок внутри раздела).

Примеры:

  • PRIMARY KEY (a) : ключ раздела является.
  • PRIMARY KEY (a, b) : ключ раздела: a , ключ кластеризации – b .
  • PRIMARY KEY ((a, b)) : составной ключ раздела (a, b) .
  • PRIMARY KEY (a, b, c) : Ключ раздела a , составной ключ кластеризации (b, c) .
  • PRIMARY KEY ((a, b), c) : составной ключ раздела (a, b) , ключ кластеризации – c .
  • PRIMARY KEY ((a, b), c, d) : составной ключ раздела (a, b) , составной ключ кластеризации (c, d) .

В cassandra разница между первичным ключом, ключом раздела, составным ключом, ключом кластеризации всегда вызывает некоторую путаницу. Поэтому я собираюсь объяснить ниже и соединить друг с другом. Мы используем CQL (язык запросов Cassandra) для доступа к базе данных Cassandra. Примечание: – Ответ соответствует обновленной версии Cassandra. Основной ключ :-

В кассандре есть 2 разных способа использования первичного ключа.

 CREATE TABLE Cass ( id int PRIMARY KEY, name text ); 

 Create Table Cass ( id int, name text, PRIMARY KEY(id) ); 

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

Разделение и кластеризация Определение PRIMARY KEY состоит из двух частей: ключа раздела и кластеров столбцов. Первая часть сопоставляется с ключом строки ядра хранилища, а вторая – для группировки столбцов в строке.

 CREATE TABLE device_check ( device_id int, checked_at timestamp, is_power boolean, is_locked boolean, PRIMARY KEY (device_id, checked_at) ); 

Здесь device_id является ключом раздела и checked_at является cluster_key.

Мы можем иметь несколько ключей кластера, а также ключ раздела, который зависит от объявления.

Первичный ключ : состоит из ключей разделов [и дополнительных ключей кластеризации (или столбцов)]
Ключ раздела : хеш-значение ключа раздела используется для определения конкретного узла в кластере для хранения данных
Кластерный ключ : используется для сортировки данных в каждом из разделов (или ответственного узла и его реплик)

Compound Primary Key : Как указано выше, ключи кластеризации являются необязательными в основном ключе. Если они не упоминаются, это простой первичный ключ. Если упоминаются ключи кластеризации, это первичный ключ соединения.

Компонентный разделительный ключ. Использование только одного столбца в качестве ключа раздела может привести к возникновению проблем с большой строкой (зависит от модели использования / данных). Следовательно, ключ раздела иногда указывается как комбинация из более чем одного столбца.

Что касается путаницы, которая является обязательной , которую можно пропустить и т. Д. В запросе, пытаясь представить Cassandra как гигантскую HashMap . Таким образом, в HashMap вы не можете получить значения без ключа.
Здесь ключи раздела играют роль этого ключа. Поэтому каждый запрос должен содержать их. Без которой Кассандра не будет знать, какой узел искать.
Клавиши кластеризации (столбцы, которые являются необязательными) помогают в дальнейшем сужении поиска запроса после того, как Cassandra обнаруживает конкретный узел (и его реплики), ответственный за этот конкретный ключ раздела .

Вкратце:

Ключ раздела – это не что иное, как идентификация строки, что идентификация в большинстве случаев является единственным столбцом (называемым Первичным ключом ), иногда комбинацией нескольких столбцов (называемых составными ключами разделов ).

Кластерный ключ – это не что иное, как индексирование и сортировка . Кластерные ключи зависят от нескольких вещей:

  1. Какие столбцы вы используете в условии where, кроме столбцов первичного ключа.

  2. Если у вас очень большие записи, то по какой причине я могу разделить дату для удобного управления. Например, у меня есть данные из 1 миллиона записей наseleniumия графства. Поэтому для удобства управления я кластер данных на основе состояния и после pincode и так далее.

Стоит отметить, что вы, вероятно, будете использовать эти партии больше, чем в аналогичных концепциях в реляционном мире (составные клавиши).

Пример. Предположим, вам нужно найти последних N пользователей, которые недавно присоединились к группе пользователей X. Как бы вы это делали эффективно, данные чтения в этом случае преобладают? Как это (из официального руководства Кассандры ):

 CREATE TABLE group_join_dates ( groupname text, joined timeuuid, join_date text, username text, email text, age int, PRIMARY KEY ((groupname, join_date), joined) ) WITH CLUSTERING ORDER BY (joined DESC) 

Здесь ключ разделения является составным, а ключ кластеризации – присоединенная дата. Причина, по которой ключ кластеризации – это дата присоединения, заключается в том, что результаты уже отсортированы (и сохранены, что ускоряет поиск). Но почему мы используем составной ключ для разделения ключа ? Потому что мы всегда хотим читать как можно меньше разделов . Как помогает join_date ? Теперь пользователи из одной группы и одна и та же дата присоединения будут находиться в одном разделе! Это означает, что мы всегда будем читать как можно меньше разделов (сначала начинаем с самого нового, затем переходим на более старый и т. Д., А не прыгаем между ними).

Фактически, в крайних случаях вам также нужно будет использовать хеш join_date, а не только join_date, так что если вы запрашиваете последние 3 дня, часто они имеют один и тот же хеш и поэтому доступны из одного раздела!

В дизайне базы данных составной ключ представляет собой набор суперключей, который не является минимальным.

Комбинированный ключ – это набор, содержащий составной ключ и по меньшей мере один атрибут, который не является суперключем

Данная таблица: СОТРУДНИКИ {employee_id, имя, фамилия}

Возможные суперключи:

 {employee_id} {employee_id, firstname} {employee_id, firstname, surname} 

{employee_id} является единственным минимальным суперключем, который также делает его единственным кандидатным ключом – при условии, что {firstname} и {surname} не гарантируют уникальность. Поскольку первичный ключ определяется как выбранный ключ-кандидат, и в этом примере существует только один ключ-кандидат, {employee_id} – это минимальная суперкарта, единственный ключ-кандидат и единственный возможный первичный ключ.

Полный список составных ключей:

 {employee_id, firstname} {employee_id, surname} {employee_id, firstname, surname} 

Единственный составной ключ – {employee_id, firstname, surname}, так как этот ключ содержит составной ключ ({employee_id, firstname}) и атрибут, который не является суперключем ({фамилия}).

Interesting Posts
Давайте будем гением компьютера.