用于编辑具有多级节点和多个用户的层次结构的架构
Posted
技术标签:
【中文标题】用于编辑具有多级节点和多个用户的层次结构的架构【英文标题】:Architecture for editing hierarchy with mutlipe levels of nodes with multiple users 【发布时间】:2013-01-03 07:34:02 【问题描述】:我正在构建一个模块来编辑节点的层次结构。您可以将其视为一个非常大的目录结构,其中包含许多级别的嵌套目录和文件。层次结构的节点存储在关系数据库表中。唯一的区别是没有文件夹/目录之类的东西。所有节点都具有相同的特征。所以一个节点有一个父节点,它也是一个节点。而且只有一个根节点,一个节点只能有一个父节点,所以没有多层次结构。
表格列:
node_id [bigint] 不为空 名称 [nvarchar(50)] parent_node_id [bigint] 叶节点 [位]
我们的目标是找出一种方法来编辑一个层次结构,而无需用户互相踩踏。我们要么必须设计版本控制架构来解决冲突,要么使用某种锁定机制(悲观或乐观)来防止其他人编辑作为整个层次结构中某个给定父节点的祖先(或子树)的一部分的节点树。如果我们执行锁,那么每个使用编辑器的人都需要不断刷新他们的树才能看到其他人的变化。
只有三个功能需要担心。只有一个用户允许在主树中编辑节点/对象。将新创建的子树拖放到主树中。将主树中的子树拖放到主树中的另一个节点中,从而使拖放的子树成为该节点的子节点。
我认为这种架构与用于管理文件夹和文件的操作系统架构没有什么不同。这通常是如何在成千上万的用户上完成的?我宁愿使用锁定机制而不是使用版本控制来降低复杂性。我只是不确定最好的方法是什么。
这是我目前的计划:
如果一个节点正在被编辑,在保存发生并且数据库即将更新记录之前不要锁定它。数据库进行更改后,将其解锁。如果其他人试图在数据库进行更改的同时编辑记录,请不要告诉用户它已被锁定。让数据库处理记录/节点上的锁。
如果新的子树被拖入主树的父节点,锁定新的父节点。然后插入新记录并更新根父节点以指向主树父节点。然后通知所有客户端更新他们的主树。所以所有锁定都发生在删除发生后的数据库端。
如果一个现有的主树父节点被拖到一个现有的主树父节点中,并成为一个子节点,那么我们应该锁定旧的父节点(成为新的子节点)并锁定新的父节点。然后更新新子节点的父节点。然后更新所有客户端(所有用户)并更新他们的主树。所以所有锁定都发生在删除发生后的数据库端。
【问题讨论】:
【参考方案1】:对于 1,您可以只使用乐观锁。 (您当前的方法意味着“最后的数据覆盖现有的”)。
关于 2 和 3 - 似乎只需重新链接节点即可实现拖放,因此您可以使其更容易一些 - 无需过多的数据复制。
在这种情况下,您可以引入link lock
,它会锁定链接的两端。这可以防止“源”节点同时移动到其他“目标”节点;它还可以防止突然的“目标”节点移动,这对客户来说应该是一个惊喜。
【讨论】:
当您说“链接锁定”时,您是在暗示让孩子指向父母,让父母指向孩子?您建议我们如何处理客户端刷新? 没有。那不是连接节点的链接。这首先是一个锁,这意味着您显式地管理悲观锁。因此,在进行链接操作之前,您需要创建一个链接锁(锁定两端以防止重新链接)。如果任何一端已被锁定 - 回滚事务。此外,我不确定该锁如何对最终用户起作用。基本上,我们在用户进行修改之前故意执行锁定(例如打开编辑窗口)。但是如何将这种锁应用于拖放操作呢?你开始拖动,你肯定知道一个节点,但你怎么知道目的地?以上是关于用于编辑具有多级节点和多个用户的层次结构的架构的主要内容,如果未能解决你的问题,请参考以下文章
10,组合模式(Composite Pattern)是将对象组合成树形结构以表示“部分--整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。
MySQL查询父节点下面的所有子孙节点,查询用户列表时多级(公司)部门处理,根据反射,递归树形结构工具类