Почему Cassandra UPDATE не нарушает правило чтения перед записью?

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

  1. Нет чтения перед записью (предположительно, это связано с тем, что запись выполняется последовательно, тогда как чтение требует сканирования индекса первичного ключа)
  2. INSERT и UPDATE имеют одинаковую семантику (указанную в старой версии < href="http://cassandra.apache.org/doc/cql3/CQL.html" rel="nofollow">руководство по CQL, но, по-видимому, по-прежнему считается верным)

Предположим, я создал следующую простую таблицу:

CREATE TABLE data (
  id varchar PRIMARY KEY,
  names set<text>
);

Теперь я вставляю некоторые значения:

insert into data (id, names) values ('123', {'joe', 'john'});

Теперь, если я сделаю обновление:

update data set names = names + {'mary'} where id = '123';

Результаты ожидаемы:

 id  | names
-----+-------------------------
 123 | {'joe', 'john', 'mary'}

Разве это не тот случай, когда чтение должно происходить перед записью? "Стоимость" выглядит следующим образом.

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

Вставка будет просто делать только последнее из них.


person John D.    schedule 28.04.2015    source источник


Ответы (1)


Нет необходимости читать, прежде чем писать.
Внутренне каждая коллекция хранит данные, используя один столбец для каждой записи. Когда вы запрашиваете новую запись в коллекции, операция выполняется в одном столбце*: если столбец уже существует, он будет перезаписан, в противном случае он будет создан (InsertOrUpdate). По этой причине каждая запись в коллекции может иметь собственный ttl и время записи.

* в то время как с Map и Set это прозрачно, существует некоторая внутренняя хитрость, позволяющая разрешить несколько столбцов с одним и тем же именем внутри List.

person Carlo Bertuccini    schedule 30.04.2015
comment
Если я правильно вас понимаю, вы говорите, что моя вставка и обновление выше - это просто две вставки. Исходный устанавливает один столбец со значением {'joe', 'john'}, а второй устанавливает совершенно новый столбец со значением {'mary'}. То, что они представлены в виде набора в одном столбце (имена), фактически является представлением о том, что на самом деле является несколькими столбцами. - person John D.; 30.04.2015
comment
Частично верно. Первая вставка устанавливает 2 новых столбца, а не один. И если вы снова выполните операцию обновления, вы перезапишете последний столбец (mary) новым временем записи. ни в коем случае не читается - person Carlo Bertuccini; 30.04.2015