Синхронизация записей в денормализованных моделях данных - PullRequest
0 голосов
/ 17 сентября 2018

Я читаю «Кассандра: исчерпывающее руководство» и пытаюсь понять, как работает денормализация.

У них есть модель данных с двумя таблицами, содержащими информацию об отеле, таблицей «отели» иТаблица "hotels_by_poi" (poi обозначает достопримечательности).В каждой таблице они включают название, телефон, адрес отеля.

Насколько я понимаю, они делают это, потому что таблица hotels_by_poi оптимизирована для запроса, в котором вы ищете отель по интересующему объекту (кластеризует отели по hotel_id, но разделяет по poi_name), и таблица отелей предназначена для запросов, по которым вы запрашиваете конкретный отель (разделен по hotel_id).

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

Например, если я хочу обновить название отеля, мне нужно выполнить эти запросы

UPDATE hotel.hotels
SET name = 'Updated Hotel Name'
WHERE hotel_id = 1234;

# For each poi_id associated with my hotel
UPDATE hotel.hotels_by_poi
SET name = 'Updated Hotel Name'
WHERE hotel_id = 1234 AND poi_id = 5678;

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

Однако может случиться, что два обновления названия отеля произойдут примерно в одно и то же время. Теперь у нас есть условие гонки между каждым набором запросов. Мы можем столкнуться с ситуацией, когда выигрывают 3 из первого обновления и 3 изпобеда во втором обновлении. Оставляя несоответствие.

Как мы правильно обрабатываем синхронизацию этой информации в базах данных, таких как Cassandra?

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете использовать операторы BATCH для достижения атомарности.Поместите 6 запросов в один пакет, чтобы все они выполнялись вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...