我正在阅读《 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这样的数据库中正确同步此信息?