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


Answers

Добавление ответа redux в качестве принятого достаточно велико. Термины «строка» и «столбец» используются в контексте CQL, а не как фактически реализована Cassandra.

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

Примеры:

  • PRIMARY KEY (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) .
Question

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

primary key,
partition key, 
composite key 
clustering key



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

Пример. Предположим, вам нужно найти последних 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, а не только join_date, так что если вы запрашиваете последние 3 дня, часто они имеют один и тот же хеш и поэтому доступны из одного раздела!




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

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

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

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