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

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

primary key,
partition key, 
composite key 
clustering key

7 ответов


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

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

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

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

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

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

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

в положение композитные первичный ключ," первая часть " ключа называется КЛЮЧ РАЗДЕЛА (в данном примере 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)      
  );

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

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

дополнительная информация об использовании:ДОКУМЕНТАЦИЯ ПО DATASTAX


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

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

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

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

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

надеюсь, что это помогает.


добавление ответа redux, поскольку принятый довольно длинный. Термины "строка" и "столбец" используются в контексте 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).

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

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

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

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

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

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

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.

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


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

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

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

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


вкратце смысл:

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

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

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

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


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

Пример-Предположим, вам нужно найти последних 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)

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

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


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

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

данная таблица: сотрудники {employeee_id, firstname, фамилия}

можно superkeys являются:

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

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

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

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

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