У нас есть некоторая сущность, однозначно идентифицируемая сгенерированным UUID. Нам нужна поддержка поиска по имени запроса. Также нам нужно поддерживать сортировку по имени.
Мы знаем, что будет не более 1000 сущностей этого типа, которые идеально поместятся в одну строку. Является ли жизнеспособной идея жестко закодировать первичный ключ, использовать имя в качестве ключа кластеризации и идентификатор в качестве ключа кластеризации, чтобы удовлетворить уникальность. Допустим, нам нужна школьная организация. Вот пример:
CREATE TABLE school (
constant text,
name text,
id uuid,
description text,
location text,
PRIMARY KEY ((constant), name, id)
);
Начальное состояние было бы дать мне все школы, а затем произойдет фильтрация по точному имени. Наша причина заключалась в том, чтобы поместить все школы в одну строку для быстрого доступа, иметь имя в качестве столбца кластеризации для фильтрации и иметь идентификатор в качестве столбца кластеризации, чтобы гарантировать уникальность. Мы можем использовать constant = school
как известное жестко заданное значение для доступа к этой строке.
Что мне нравится в этом решении, так это то, что все значения находятся в одной строке, и мы получаем быстрое чтение. Также мы можем легко решить сортировку с помощью кластеризации столбца. Что мне не нравится, так это жестко запрограммированное значение для constant
, что кажется странным. Мы могли бы использовать name
в качестве PK, но тогда у нас было бы 1000 записей, разбросанных по паре разделов, вероятно, найти все без имени было бы медленнее и не сортировалось бы.
Вопрос 1
Является ли это жизнеспособным решением и есть ли с ним проблемы, которых мы не видим? Я не видел ни одного примера моделирования данных Cassandra с жестко закодированным первичным ключом, вероятно, по той причине, что мы сомневаемся в этом решении.
Вопрос 2
Имя является редактируемым полем, оно, вероятно, будет редко меняться (кто-то может сделать опечатку или школа может изменить имя), но оно может измениться. Каков наилучший способ добиться этого? Удалить вставку внутри пакета (LTE можно применить к той же строке с условным предложением)?