Подтвердить что ты не робот

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

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

primary key,
partition key, 
composite key 
clustering key
4b9b3361

Ответ 1

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

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

Первичный ключ может быть ПРОСТОЙ и даже объявленным встроенным:

 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 - это ключ раздела), а вторая часть ключа - это CLUSTERING KEY (в этом примере 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)      
  );

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

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

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


Небольшое использование и примеры контента
ПРОСТОЙ КЛЮЧ:
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

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

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

КОМПОЗИТНЫЙ/КОМПОЗИЦИОННЫЙ КЛЮЧ может извлекать "широкие строки" (т.е. Вы можете делать запросы только по ключу раздела, даже если у вас определены ключи кластеризации)

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, это два столбца, которые определяют ключ раздела. "Общее" правило для создания запроса заключается в том, что вы должны пропустить хотя бы все столбцы ключей секционирования, а затем при желании вы можете добавить каждый ключ кластеризации в установленном порядке.

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

  • col1 и col2
  • col1 и col2 и col10
  • col1 и col2 и col10 и col 4

Недействительным:

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

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

Ответ 2

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

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

Примеры:

  • PRIMARY KEY (a): Ключ раздела - 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).

Ответ 3

В кассандре разница между первичным ключом, ключом раздела, составным ключом, ключом кластеризации всегда вызывает некоторую путаницу. Поэтому я собираюсь объяснить ниже и соединить друг с другом. Мы используем 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 порядок, в котором столбцы определены для ОСНОВНОГО КЛЮЧА, имеет значение. Первый столбец ключа называется ключом раздела, имеющим свойство, что все строки, разделяющие один и тот же ключ раздела (даже по таблице), хранятся на одном физическом node. Кроме того, вставка/обновление/удаление в рядах, имеющих один и тот же ключ раздела для данной таблицы, выполняются атомарно и изолированно. Обратите внимание, что возможно иметь составной ключ раздела, то есть ключ раздела, состоящий из нескольких столбцов, с использованием дополнительного набора круглых скобок для определения того, какие столбцы образуют ключ раздела.

Разделение и кластеризация Определение 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.

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

Ответ 4

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

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

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

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

Ответ 5

В кратком смысле:

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

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

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

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

Ответ 6

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

Пример - предположим, что вам нужно найти последних 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 дней, часто они используют один и тот же хеш и, следовательно, доступны из одного раздела!

Ответ 7

Первичный ключ в Cassandra обычно состоит из двух частей - ключа раздела и столбцов кластеризации.

primary_key ((partition_key), clustering_col)

Ключ раздела - первая часть первичного ключа. Основная цель ключа раздела - определить узел, в котором хранится конкретная строка.

CREATE TABLE phone_book (номер_телефона int, текст имени, возраст int, текст города, первичный ключ ((номер телефона, имя), возраст);

Здесь (phone_num, name) - ключ раздела. При вставке данных генерируется хеш-значение ключа разделения, и это значение определяет, в какой узел должна войти строка.

Рассмотрим кластер из 4 узлов, каждый узел имеет диапазон значений хеша, которые он может хранить. (Написать) INSERT INTO phone_book VALUES (7826573732, "Joey, 25", Нью-Йорк);

Теперь хэш-значение ключа раздела вычисляется разделителем Cassandra. скажем, хэш-значение (7826573732, 'Joey) → 12, теперь эта строка будет вставлена в узел C.

(Читать) SELECT * FROM phone_book WHERE phone_num = 7826573732 и name = Joey;

Теперь снова вычисляется хеш-значение ключа разделения (7826573732, Joey), которое в нашем случае равно 12, который находится в узле C, из которого производится чтение.

  1. Кластеризация столбцов - Вторая часть первичного ключа. Основная цель кластеризации столбцов - хранить данные в отсортированном порядке. По умолчанию порядок возрастает.

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

primary_key ((pk1, pk2), col 1, col2)

Ответ 9

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

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

Данная таблица: СОТРУДНИКИ {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}) и атрибут, который не является суперкойкой ({фамилия}).