Відмінність між розділом, складеним ключем та кластеризуючим ключем у Кассандрі?


523

Я читав статті в мережі, щоб зрозуміти відмінності між наступними keyтипами. Але мені це здається важко зрозуміти. Приклади, безумовно, допоможуть покращити розуміння.

primary key,
partition key, 
composite key 
clustering key

23
Я знайшов цю статтю, яка містить багато детальних пояснень навколо цих понять.
mynkow

Ця стаття також чітко вказує на ці терміни.
duong_dajgja

@duong_dajgja URL-адреса, якою ви поділилися вище, зламана, чи можете ви редагувати коментар із дійсною / корисною URL-адресою?
realPK

@realPK Посилання якось пішло. Але я знайшов іншу посилання для вас тут quora.com / ... .
duong_dajgja

Відповіді:


1171

Навколо цього багато плутанини, я спробую зробити це максимально просто.

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

Первинний ключ може бути простим і навіть оголошеним вбудованим:

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

За цими іменами ...

  • Partition Key відповідає за розподіл даних між вузлами.
  • Кластеризація Key відповідає за сортування даних в межах розділу.
  • Первинний ключ еквівалентний Partition ключа в одній польовий ключ таблиці (тобто Simple ).
  • Composite / З'єднання Ключ просто будь-яка клавіша декілька стовпців

Додаткова інформація про використання: 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

Сподіваюсь, це допомагає.


7
Як я писав - << Загальне "правило для запиту полягає в тому, що ви повинні передати принаймні всі стовпці ключових розділів, то ви можете додати кожен ключ у встановленому ними порядку. >> - оскільки col10 визначено раніше col4, ви повинні передати його на запит також для col4
Carlo Bertuccini

2
Ви можете додати вторинні індекси, але це не означає, що ви можете виконати "будь-який" cql-запит - і багато іншого: перед створенням вторинного індексу слід порахувати до 10 ... 000 ..... :)
Карло Бертуккіні

2
Вторинні індекси реалізуються як локальні індекси - вони не розподіляються в кластері. Кожен вузол кластера відповідає за збереження вторинних індексів даних, якими він володіє. З цієї причини запит на sec.index може залучати всі вузли кластеру
Carlo Bertuccini

5
Це мене бентежило кілька днів, дякую за цю відповідь, тепер я можу створити модель даних в голові.
Роджер Дуан

2
Ого. ти щойно врятував мене годинами чи днями! Дякую, блискуче пояснення.
Андре Гарсія

128

Додавання зведеної відповіді як прийнятої досить довго. Терміни "рядок" і "стовпець" використовуються в контексті 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).

15

У кассандрі різниця між первинним ключем, ключем розділу, складовим ключем, кластеризуючим ключем завжди викликає певну плутанину .. Тож я буду поясню нижче і спільно стосуватися один одного. Для доступу до бази даних 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.

У нас може бути кілька кластерних ключів, а також ключ розділу, що залежить від декларації.


6
Ви могли б надати трохи кредитів своїм джерелам (2013 = старший, ніж ваш пост): thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html
Крістоф Руссі

11

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

Складений первинний ключ : Як було сказано вище, клавішні кластери необов’язкові в первинному ключі. Якщо вони не згадуються, це простий первинний ключ. Якщо згадуються ключі кластеризації, це складний первинний ключ.

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

Що стосується плутанини, яке з них є обов'язковим , яке можна пропустити і т.д. у запиті, намагається уявити Кассандру як гігантського HashMap . Тож у HashMap ви не можете отримати значення без ключа.
Тут клавіші розділів відіграють роль цього ключа. Тому кожен запит повинен мати їх. Без якого Кассандра не дізнається, який вузол шукати.
У кластеризация ключі (стовпці, якіє обов'язковими) допомогу в подальшому звужують ваш пошуковий запит післяCassandra з'ясовує конкретний вузол (і це репліками) відповідає за цей конкретний ключ розділу .


5

Коротше кажучи:

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

Клавіша кластера - це не що інше, як індексація та сортування . Клавіші кластера залежать від кількох речей:

  1. Які стовпці ви використовуєте, де пункт, крім стовпців первинного ключа.

  2. Якщо у вас дуже великі записи, то з точки зору занепокоєння я можу розділити дату для зручного управління. Наприклад, у мене є дані про 1 мільйон записів населення округу. Тому для зручного управління я кластую дані на основі стану та після pincode тощо.


3
Ключ розділу НЕ є ідентифікацією для рядка ... він ідентифікує купу рядків, усі з яких мають той самий ключ розділу
wmac

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 допомагає? Тепер користувачі з тієї ж групи та тієї ж дати приєднання будуть проживати в одному розділі! Це означає, що ми завжди будемо читати якомога менше розділів (спочатку почніть з найновіших, потім перейдіть до старших тощо), а не стрибайте між ними.

Насправді, в крайніх випадках, вам також потрібно буде використовувати хеш файлу join_date, а не посилання_на_приєднанні, так що якщо ви запитуєте останні 3 дні, вони часто використовують один і той же хеш, і тому вони доступні з одного розділу!


0

Первинний ключ у Кассандрі зазвичай складається з двох частин - ключа розділу та стовпчиків кластеризації.

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, з якого проводиться зчитування.

  1. Стовпчасті стовпчики - друга частина первинного ключа. Основна мета створення кластерних стовпців - зберігання даних у відсортованому порядку. За замовчуванням замовлення зростає.

У первинному ключі може бути більше одного ключа розділу та стовпчикових стовпців залежно від запиту, який ви вирішуєте.

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


-3

У дизайні бази даних складний ключ - це набір супер-ключів, який не є мінімальним.

Складений ключ - це набір, який містить складений ключ і принаймні один атрибут, який не є надбудовою

Дана таблиця: ПРАЦІВНИКИ {співробітник_id, ім'я, прізвище}

Можливі супер-ключі:

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

{служитель_id} - це єдиний мінімальний супер-ключ, який також робить його єдиним ключем-кандидатом - враховуючи, що {ім'я} та {прізвище} не гарантують унікальність. Оскільки первинний ключ визначений як обраний кандидат-ключ, і в цьому прикладі існує лише один кандидат-ключ, {служитель_id} - це мінімальний супер-ключ, єдиний кандидат-ключ і єдиний можливий первинний ключ.

Вичерпний список складних ключів:

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

Єдиний складовий ключ - {служитель_id, ім’я, прізвище}, оскільки цей ключ містить складений ключ ({службовець_id, ім'я}) та атрибут, який не є надключем ({прізвище}).


Зовсім не має значення для поставленого питання. Будь ласка, відредагуйте відповідь на ключові адреси, задані в контексті Кассандри, а не загальне пояснення. TY.
realPK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.