【问题标题】:Keeping records in sync in denormalized data models在非规范化数据模型中保持记录同步
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 这种情况下的原子性意味着如果一次插入/更新成功,所有将成功,但不提供任何类型的事务保证。在您发布的链接中,“Cassandra 在批处理级别没有其他事务强制执行。例如,除非批处理操作写入单个分区,否则没有批处理隔离。”
    • 如果您阅读“批处理条件更新”,我认为您可以使用轻量级事务来避免竞争。将以下DML语句放入批处理UPDATE hotel.hotels_by_poi SET name = 'Updated Hotel Name' WHERE hotel_id = 1234 AND poi_id = 5678 IF name = ‘Old Name’;
    • 是的!这样就可以了!谢谢。
    • 再想一想,这也取决于您的复制因子和一致性级别。假设您使用 RF 3 并编写 CL ONE。您可能会看到成功的写入,但仍然存在竞争条件,具体取决于您在客户端中命中的节点,直到数据一致。最终它应该是正确的,因为最后一个时间戳的更新将是一致的
    • 它们是否有可能具有相同的时间戳?不确定节点的同步是如何工作的。是否考虑到轻量级交易?如果是这样,那么其中一批可能会被完全丢弃,这也很好。如果我需要它是正确的,最好只写更高的一致性级别。
    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 2015-01-28
    • 1970-01-01
    • 2014-10-03
    • 2016-05-27
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多