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

yqkkidmi  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(362)

我正在读《Cassandra:权威指南》,我试图理解非规范化是如何工作的。
他们有一个包含酒店信息的两个表的数据模型,一个是“hotels”表,另一个是“hotels\u by\u poi”表(poi代表兴趣点)。在每一张表格中,他们包括酒店的名称、电话、地址。
我的理解是,他们这样做是因为hotels\u by\u poi表针对按兴趣点搜索酒店的查询进行了优化(按hotel\u id对酒店进行聚类,但按poi\u名称进行分区),而hotel表针对的是查询特定酒店的查询(按hotel\u 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这样的数据库中正确地同步这些信息?

34gzjxbg

34gzjxbg1#

您可以使用批处理语句来实现原子性。将这6个查询放在一个批处理中,这样所有查询要么一起执行。

相关问题