我正在使用mongodb并存储树数据( MongoDB是目前唯一的选择)。
10 ->>> Root node
/\
/ \
8 6 ---->> 8 & 6 child node of 10
/\ /\
/ \ / \
4 5 2 1 ---->> 4 & 5 child node of 8 ...
在mongoDB中,每个节点都是一个单独的文档,并且每个文档都有一堆字段。
样本数据,
{
"_id": "234463456453643563456",
"name": "Mike",
"empId": "10",
"managerId": "8",
"hierarchy": [
8,
10
]
"projects" : [ "123", "456", "789"]
}
在这里,hierarchies字段将具有从第1级到顶级的经理ids。
任何文档都可以使用任何字段进行更新,节点可以移动到任何位置。基本上,就是组织结构的改变。
我有一个用例,其中更改将在其他系统中捕获,并且我的系统将每2小时更新一次完整的活动负载(80万条记录中的200k条记录)。
在这里,如果有任何组织更改,如8移动到6以下,则从下到上的层次结构将更改为8以下的所有节点。如果在b/w中完全加载失败,则在完成加载之前,组织层次结构结果将不会正确。
结果应该是在完全更新之前或完全更新之后,而不是在b/w中。我正在考虑版本控制来处理这个问题。有没有更好的方法用mongo来处理这个问题呢?
满载时大约有200k条记录。但是,实际的变化可能会少于1k的记录,我们不知道很多次。
发布于 2020-10-18 01:42:04
如果您需要全有或全无(原子)数据库更新,其中数据库客户端不能读取无效的更新中状态,那么您需要一个事务。
您可以通过认识到图的某些子集在更新后是有效的来进行优化,因此对图的子集的查询是有效的,然后您就不需要使用数据库的事务特性了。
但您仍然会阻止或拒绝来自某些客户端的查询,这会使您的模式、查询或体系结构变得更加复杂。
如果这是一个业务问题,那么我会推动业务需求。(如果你可以这样做,你没有说这是否是一个选项。)
您的客户端已经在读取可能已过期2小时的数据。如果您正在应用的批量更新是排序的,那么您可以按时间顺序进行这些更新,并且您的客户端将始终接收最近有效的状态(但可能不是最近的状态)。
https://stackoverflow.com/questions/64287059
复制相似问题