Я читав статті в мережі, щоб зрозуміти відмінності між наступними key
типами. Але мені це здається важко зрозуміти. Приклади, безумовно, допоможуть покращити розуміння.
primary key,
partition key,
composite key
clustering key
Я читав статті в мережі, щоб зрозуміти відмінності між наступними key
типами. Але мені це здається важко зрозуміти. Приклади, безумовно, допоможуть покращити розуміння.
primary key,
partition key,
composite key
clustering key
Відповіді:
Навколо цього багато плутанини, я спробую зробити це максимально просто.
Первинний ключ - це загальне поняття для позначення одного або декількох стовпців, які використовуються для отримання даних із таблиці.
Первинний ключ може бути простим і навіть оголошеним вбудованим:
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 (в даному прикладі key_part_one є ключем розділу) , а друга частина ключа є кластеризації 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 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, це два стовпці, які визначають ключ розділу. "Загальне" правило для запиту полягає в тому, що ви повинні передати принаймні всі стовпці ключових розділів, тоді ви можете необов'язково додати кожен кластеризаційний ключ у встановленому їм порядку.
тому дійсними запитами є ( крім вторинних індексів )
Недійсний:
Сподіваюсь, це допомагає.
Додавання зведеної відповіді як прийнятої досить довго. Терміни "рядок" і "стовпець" використовуються в контексті 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). Примітка: - Відповідь відповідає оновленій версії Кассандри. Первинний ключ: -
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 - ключ розділу, а check_at - кластер_key.
У нас може бути кілька кластерних ключів, а також ключ розділу, що залежить від декларації.
Первинний ключ : складається з ключів (-ів) розділів [та необов'язкових ключів кластеризації (або стовпців)]
Роздільний ключ : хеш-значення ключа розділу використовується для визначення конкретного вузла в кластері для зберігання даних
Ключ кластеризації : використовується для сортувати дані у кожному з розділів (або відповідальний вузол та його репліки)
Складений первинний ключ : Як було сказано вище, клавішні кластери необов’язкові в первинному ключі. Якщо вони не згадуються, це простий первинний ключ. Якщо згадуються ключі кластеризації, це складний первинний ключ.
Композиційний ключ розділу : Використання лише одного стовпчика як ключа розділу може призвести до проблем із широкими рядами (залежить від моделювання використання випадку / даних). Отже, ключ розділу іноді задається у вигляді комбінації більш ніж одного стовпця.
Що стосується плутанини, яке з них є обов'язковим , яке можна пропустити і т.д. у запиті, намагається уявити Кассандру як гігантського HashMap . Тож у HashMap ви не можете отримати значення без ключа.
Тут клавіші розділів відіграють роль цього ключа. Тому кожен запит повинен мати їх. Без якого Кассандра не дізнається, який вузол шукати.
У кластеризация ключі (стовпці, якіє обов'язковими) допомогу в подальшому звужують ваш пошуковий запит післяCassandra з'ясовує конкретний вузол (і це репліками) відповідає за цей конкретний ключ розділу .
Коротше кажучи:
Ключ розділу - це не що інше, як ідентифікація для рядка; ідентифікація більшості випадків являє собою єдиний стовпець (званий первинний ключ ), іноді комбінацію декількох стовпців (званих Композиційний ключ розділу ).
Клавіша кластера - це не що інше, як індексація та сортування . Клавіші кластера залежать від кількох речей:
Які стовпці ви використовуєте, де пункт, крім стовпців первинного ключа.
Якщо у вас дуже великі записи, то з точки зору занепокоєння я можу розділити дату для зручного управління. Наприклад, у мене є дані про 1 мільйон записів населення округу. Тому для зручного управління я кластую дані на основі стану та після 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, а не посилання_на_приєднанні, так що якщо ви запитуєте останні 3 дні, вони часто використовують один і той же хеш, і тому вони доступні з одного розділу!
Первинний ключ у Кассандрі зазвичай складається з двох частин - ключа розділу та стовпчиків кластеризації.
Primary_key ((розділ_key), clustering_col)
Ключ розділу - перша частина первинного ключа. Основна мета ключа розділу - визначити вузол, який зберігає певний рядок.
СТВОРИТИ ТАБЛИЦІ телефонну книгу (phone_num int, текст імені, вік int, текст міста, ПЕРВИЧНИЙ КЛЮЧ ((phone_num, ім'я), вік);
Тут (phone_num, name) - ключ розділу. Під час вставки даних генерується хеш-ключ ключа розділу, і це значення визначає, у який вузол слід входити рядок.
Розглянемо кластер 4 вузлів, кожен вузол має діапазон хеш-значень, який він може зберігати. (Запишіть) ВСТАВИТЬ В НАДІЙНИК телефонної книги (7826573732, "Joey", 25, "New York");
Тепер хеш-значення ключа розділу обчислюється учасником Cassandra. скажімо, значення хеша (7826573732, 'Joey') → 12, тепер цей рядок буде вставлено у Вузол C.
(Прочитати) ВИБІР * ВІД телефонної книги ДІЙ телефон_num = 7826573732 та name = 'Joey';
Тепер знову обчислюється хеш-ключ ключа розділу (7826573732, "Joey"), що в нашому випадку є 12, яке знаходиться в Вузлі C, з якого проводиться зчитування.
У первинному ключі може бути більше одного ключа розділу та стовпчикових стовпців залежно від запиту, який ви вирішуєте.
Primary_key ((pk1, pk2), col 1, col2)
У дизайні бази даних складний ключ - це набір супер-ключів, який не є мінімальним.
Складений ключ - це набір, який містить складений ключ і принаймні один атрибут, який не є надбудовою
Дана таблиця: ПРАЦІВНИКИ {співробітник_id, ім'я, прізвище}
Можливі супер-ключі:
{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}
{служитель_id} - це єдиний мінімальний супер-ключ, який також робить його єдиним ключем-кандидатом - враховуючи, що {ім'я} та {прізвище} не гарантують унікальність. Оскільки первинний ключ визначений як обраний кандидат-ключ, і в цьому прикладі існує лише один кандидат-ключ, {служитель_id} - це мінімальний супер-ключ, єдиний кандидат-ключ і єдиний можливий первинний ключ.
Вичерпний список складних ключів:
{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}
Єдиний складовий ключ - {служитель_id, ім’я, прізвище}, оскільки цей ключ містить складений ключ ({службовець_id, ім'я}) та атрибут, який не є надключем ({прізвище}).