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



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



primary key,
partition key,
composite key
clustering key
1180   7  

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)      
  );

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

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

дополнительная информация об использовании:ДОКУМЕНТАЦИЯ 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 разница между первичным ключом, ключом раздела, составным ключом, ключом кластеризации всегда вносит некоторую путаницу.. Поэтому я собираюсь объяснить ниже и co относятся друг к другу. Мы используем 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, порядок, в котором столбцы определяются для вопросов первичного ключа. Первый столбец ключа называется ключом секции, имеющим свойство, что все строки, разделяющие один и тот же ключ секции (даже по всей таблице на самом деле), хранятся на одном физическом узле. Кроме того, вставка/обновление/удаление строк, совместно использующих один и тот же ключ раздела для данной таблицы, выполняются атомарно и изолированно. Обратите внимание, что можно иметь составной ключ секции, т. е. ключ секции, сформированный из нескольких столбцов, используя дополнительный набор скобок для определения столбцов, образующих ключ секции.

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

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, вы не можете получить значения без ключа.
здесь раздела играть роль этого ключа. Поэтому каждый запрос должен иметь их указанные. Без которого Кассандра не будет знать, какой узел искать.
Элемент кластеризации ключи (столбцы, которые являются необязательными) помогают в дальнейшем сужении поиска запроса после Кассандра узнает конкретный узел (и это реплики), ответственный за этот конкретный ключевые разделы.

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

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

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

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

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

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

Пример-Предположим,вам нужно найти последних 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 там помогает? Теперь пользователи из одной группы и одной даты соединения будут находиться в одном разделе! Это означает, что мы всегда будем читать, как несколько разделы, насколько это возможно (сначала начните с самых новых, затем перейдите к более старым и так далее, а не прыгать между ними).

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.