2015-08-06 5 views
0

В настоящее время, у меня есть две таблицы, как это:Обратный индекс в CQL

create table id_to_name (
    userid uuid, 
    name_id int, 
    name text, 
    PRIMARY KEY(userid, name_id) WITH CLUSTERING ORDER BY (name_id) 
); 

create table name_to_id (
    userid uuid, 
    name text, 
    name_id int, 
    PRIMARY KEY(userid, name) WITH CLUSTERING ORDER BY (name) 
); 

(У нас есть конкретный случай использования почему name_id является INT вместо UUID).

Мне нужно выбрать имя через name_id и имя_ид через имя. Есть ли способ, которым я могу сделать это эффективно в одной таблице?

Если нет, и мы сделали auto_incname, то можем ли мы гарантировать, что они будут соответствовать таблицам? Является ли триггером лучший выбор?

ответ

1

В Кассандре нет автоматических инкрементов, о которых я знаю. Вот почему uuid были изобретены, так что каждый узел мог назначать уникальные значения без столкновения со значениями, назначенными другими узлами.

Также я думал, что триггеры в Кассандре были несколько экспериментальными, поэтому я не использовал их.

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

В долгосрочной перспективе этот тип прецедента будет поддерживаться материализованными видами. Вы должны создать одну таблицу в качестве базовой таблицы, а затем определить вторую таблицу как представление. Затем Кассандра позаботится о сохранении вида автоматически при обновлении базовой таблицы. Это будет доступно в версии 3.0, которая находится в альфа-версии на этом этапе.

Смежные вопросы