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

Keeping records in sync in denormalized data models

我正在阅读 "Cassandra: The Definitive Guide",我正在尝试了解反规范化的工作原理。

他们有一个数据模型,其中包含两个包含酒店信息的 table,一个 "hotels" table 和一个 "hotels_by_poi" table(poi 代表兴趣点)。在每个 table 中,它们包括名称、phone、酒店地址。

我的理解是他们这样做是因为 hotels_by_poi table 针对您按兴趣点搜索酒店的查询进行了优化(按 hotel_id 的酒店群但在 poi_name 上分区),而酒店 table 用于查询特定酒店(在 hotel_id 上分区)。

但是,我想知道我们如何确保这些数据在更新时保持同步?因为我们似乎并没有真正的交易(有轻量级交易(我认为它可能在 table 中连续工作?,实际上似乎不提供任何跨国担保的批次)。

例如,如果我想更新酒店名称,我需要执行这些查询

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 这样的数据库中正确同步这些信息?

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