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

时间:2018-09-17 04:25:37

标签: cassandra nosql denormalization

我正在阅读《 Cassandra:权威指南》,并试图了解非规范化的工作原理。

它们具有一个数据模型,该数据模型包含两个包含酒店信息的表,一个“酒店”表和一个“ hotels_by_poi”表(poi代表景点)。在每个表中,它们包括酒店的名称,电话和地址。

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

但是,我想知道我们如何确保这些数据保持同步以进行更新?由于我们似乎并没有真正的交易(似乎有轻量级交易(我认为这可能适用于表格中的一行吗?而实际上似乎并没有提供任何跨国担保的批次)。

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

const filterArray = ['a', 'b']
const objectToBeFilter = {
  a: {
    ab: 'ab',
    ac: 'ac',
    ad: 'ad'
  },
  b: {
    bb: 'bb',
    bc: 'bc',
    bd: 'bd'
  },
  c: {
    cb: 'cb',
    cc: 'cc',
    cd: 'cd'
  }
}


let result = filterArray.map(key => objectToBeFilter[key])
console.log(result)

因此,如果一家酒店附近有5个景点,那么总共将有6个查询。

但是,可能会在同一时间对酒店名称进行两次更新。现在,我们在每组查询之间都有一个竞争条件。我们可能会遇到这样的情况:第一个更新赢得3个,第二个更新赢得3个。留下不一致的地方。

我们如何处理在Cassandra这样的数据库中正确同步此信息?

1 个答案:

答案 0 :(得分:1)

您可以使用BATCH statements来实现原子性。将这6个查询放在同一批中,以便它们全部一起执行。