【发布时间】:2019-02-20 23:09:16
【问题描述】:
我正在阅读“Cassandra:权威指南”,并试图了解非规范化的工作原理。
他们有一个数据模型,其中包含两个包含酒店信息的表、一个“hotels”表和一个“hotels_by_poi”表(poi 代表兴趣点)。在每个表格中,它们都包括酒店的名称、电话、地址。
我的理解是他们这样做是因为hotels_by_poi 表针对您按兴趣点搜索酒店的查询进行了优化(按hotel_id 对酒店进行集群,但在poi_name 上进行分区),而hotel 表用于查询您正在查询特定酒店(按 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