Я читал статьи в сети, чтобы понять разницу между следующими типами ключей
. Но мне кажется, что это трудно понять. Примеры, безусловно, помогут лучше понять.
primary key,
partition key,
composite key
clustering key
В этом вопросе много путаницы, поэтому я постараюсь объяснить все как можно проще.
Первичный ключ - это общее понятие для обозначения одного или нескольких столбцов, используемых для получения данных из таблицы.
Первичный ключ может быть SIMPLE и даже объявлен в строке:
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)
);
В ситуации с КОМПОЗИТНЫМ первичным ключом "первая часть" ключа называется 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)
);
За этими именами ...
Дополнительная информация по использованию: ДОКУМЕНТАЦИЯ DATASTAX
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 - эти два столбца определяют ключ раздела. Общее "правило" для выполнения запроса заключается в том, что вы должны передать как минимум все столбцы ключа раздела, затем вы можете добавить по желанию каждый ключ кластеризации в том порядке, в котором они заданы.
Таким образом, допустимыми запросами являются (без учета вторичных индексов)
Неверно:
Надеюсь, это поможет.
Добавление краткого ответа, поскольку принятый ответ довольно длинный. Термины "строка" и "столбец" используются в контексте 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)
.CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
В CQL порядок определения столбцов для PRIMARY KEY имеет значение. Первый столбец ключа называется ключом раздела, свойство которого заключается в том, что все строки с одним и тем же ключом раздела (даже в разных таблицах) хранятся на одном физическом узле. Кроме того, вставка/обновление/удаление строк с одним и тем же ключом раздела для данной таблицы выполняются атомарно и изолированно. Обратите внимание, что можно иметь составной ключ раздела, то есть ключ раздела, сформированный из нескольких столбцов, используя дополнительный набор круглых скобок для определения того, какие столбцы формируют ключ раздела.
Разбиение и кластеризация. Определение 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 - ключ кластера.
Мы можем иметь несколько кластерных ключей, а также ключей разделов, что зависит от декларации.
Первичный ключ: состоит из ключа раздела(ов) [и необязательные ключи кластеризации(или столбцов)]<БР> Секции и ключа: хэш-значение ключа секционирования используется для определения конкретного узла в кластере для хранения данных,<БР> Ключа кластеризации: используется для сортировки данных в каждом из разделов(или ответственного узла, и он'реплики с)
Первичный ключ соединение: как сказано выше, ключи кластеризации являются обязательными в первичный ключ. Если они не'т упомянул, это'ы простой первичный ключ. Если ключи кластеризации упоминаются, это'с составным первичным ключом.
Составного ключа секционирования: используя только один столбец в качестве ключа секции, может привести к широкий ряд вопросов (в зависимости от использования/моделирование данных). Следовательно, ключевой раздел иногда определяется как сочетание более чем одного столбца.
Что касается путаницы, один из которых является обязательным, которые могут быть пропущены и т. д. в запросе, пытается представьте себе Кассандру, как гигантская хранилище HashMap помогает. Так что в HashMap, вы можете'т получить значения без ключа. <БР>здесь раздела играть роль ключа. Поэтому каждый запрос должен быть им задан. Без которых Кассандра выиграл'т знаю, на каком узле искать.<БР> В кластеризации ключи (столбцы, которые не являются обязательными) помощь в дальнейшем сужение поискового запроса после того, как Кассандра узнает конкретный узел(и это'ы реплик) несет ответственность за этого конкретного раздел ключ.
Вкратце смысл:
Раздела В ничего но идентификационный для строки, что идентификация в большинстве случаев является один столбец (под названием первичный ключ) иногда сочетание нескольких столбцов (называемых составной ключ раздела).
Ключа кластера ничего, кроме индексации &ампер; сортировка. Ключи кластера зависит от нескольких вещей:
Какие столбцы использовать в предложении where, за исключением столбцов первичного ключа.
Если у вас есть очень большие записи о том, что беспокойства я могу разделить дате для легкого управления. Например, у меня есть сведения из 1миллион уездного населения. Поэтому для простоты управления, я кластера данных основывается на состоянии и после пинкод и так далее.
Стоит отметить, вы будете, вероятно, использовать те много больше, чем в аналогичных понятий в реляционной мира (составные ключи).
Пример - Предположим, вам надо найти последние N пользователей, кто недавно присоединился к группе пользователей X. Как бы вы сделать это эффективно, учитывая, читает преобладают в этом случае? Как что (от официального [руководство Кассандра][1]):
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 дня часто разделяют тот же самый хэш и поэтому доступны из одного раздела!
[1]: https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling на "Кассандра правила руководство и"
Первичный ключ в Афоне, как правило, состоит из двух частей - основных разделов и столбцов кластеризация.
primary_key((partition_key), clustering_col )
Ключевых раздела - В первой части первичного ключа. Основной целью ключевого раздела-определить узел, который хранит определенную строку.
Создать таблицу phone_book ( phone_num инт название текста, возраст инт городской текст, Первичный ключ ((phone_num, имя), возраст);
Здесь, (phone_num, имя) является ключевым разделом. При вставке данных, хэш-значение ключа секции создается, и это значение определяет, какой узел строки должны идти в.
Рассмотрим кластер 4 узла, каждый узел имеет диапазон хеш-значений он может хранить. (Напишите) Вставить в значения phone_book (7826573732, ‘Джоуи’, 25, ‘Нью-Йорк’);
Теперь, хэш-значение ключа секции рассчитывается Кассандра разметки. скажем, хэш-значение(7826573732, ‘Джоуи’) → 12 , сейчас эта строка будет вставлена в узел C.
(Читать) Выберите * от phone_book Где phone_num=7826573732 и имя=’Джоуи’;
Теперь, опять же хэш-значение ключа секционирования (7826573732,’Джоуи’) рассчитывается, который 12 в нашем случае, который находится в узле C, из которой делается.
Там может быть больше, чем один раздел ключ и кластеризация столбцов в первичном ключе, в зависимости от запроса вы решаете.
primary_key (как(pk1, pk2), столбец 1,столбец col2)
В проектировании баз данных, составной ключ-это набор superkeys, что это не минимальный.
Составной ключ-это набор, который содержит составного ключа и по меньшей мере один атрибут, который не суперключ
Данной таблицы: сотрудники {ид_сотрудника, имя, отчество}
Можно superkeys являются:
{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}
{ид_сотрудника} - это только минимальный суперключ, что также делает его единственным кандидатом, учитывая, что {имя} и {фамилия} не гарантирует уникальности. Поскольку первичный ключ определяется как выбирается потенциальный ключ, и только один потенциальный ключ существует в этом примере {ид_сотрудника} - это минимальный суперключ, единственный потенциальный ключ, и единственный возможный первичный ключ.
Полный список ключей соединение:
{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}
Единственный составной ключ {ид_сотрудника, имя, отчество}, так что ключ содержит составной ключ ({ид_сотрудника,имя}) и атрибут, который не суперключ ({фамилия}).