在非规范化数据模型中保持记录同步

问题描述 投票:1回答:1

我正在阅读“Cassandra:The Definitive Guide”,我试图了解非规范化的工作原理。

他们有一个数据模型,其中包含两个包含酒店信息的表,一个“酒店”表和一个“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这样的数据库正确同步这些信息?

cassandra nosql denormalization
1个回答
1
投票

你可以使用BATCH statements来实现原子性。将6个查询放在一个批处理中,以便所有这些查询一起执行。

© www.soinside.com 2019 - 2024. All rights reserved.