考虑两个数据库A和B,其中行具有公共主键(PK)。两个数据库只能由函数return all keys of items [X,Y[
查询。密钥是非顺序的,因此该查询可以返回,例如
>>> get_Akeys(0, 5)
>>> [20, 21, 23, 24, 25]
>>> get_Bkeys(0, 5)
>>> [20, 21, 23, 24, 25]
随着时间的推移,数据库A会发生变化(B没有):它有行添加(始终使用增量PK)和行已删除(任何有效的PK)。目的是使数据库B与A保持同步。为此,可以向数据库B添加行A - B
(设置减法),并删除行B - A
。
不幸的是,我们无权访问完整数据库A:禁止get_Akeys(0, 10**10)
格式的查询,因为| A |太大了因此,一种策略是砍掉它,例如getA(i) = get_Akeys(i*N, (i + 1)*N)
其中N是常量,并按顺序查询。
但是,这会破坏请求的原子性:考虑A = [20,21,22,25,26,27,28]
和B = [20,21,22,25,26,27]
N = 3
以及此事件序列:
getA(0) == [20,21,22] == getB(0)
(一切正确)A.delete_key(22) # getA(0) becomes [20,21,25]
getA(1) == [26,27,28] != [25,26,27] == getB(1)
在3.中,结果意味着应该从B中删除元素25(错误),并且应该添加元素28(正确)。
有关如何使用上述约束同步两个数据库的任何想法?
在我的用例中,每个getA
花费约1分钟用于我正在使用的N,获取所有条目需要约100个查询N / | A |我正在使用,同步可能需要2天才能完成。
答案 0 :(得分:1)
不要将getA()
限制为最多返回固定的数量键,而是将其限制为返回特定范围内的键。然后,# getA(0) becomes [20,21,25]
运行后,A.delete_key(22)
永远不会发生getA(0) = [20,21]
。 25仍然属于下一组。
根据你的定义("返回项目的所有键[X,Y ["," getA(i)= get_Akeys(i * N,(i + 1)* N&# 34;),无论如何你必须做的事情,所以我对这个问题感到困惑。