任务、父子任务的关系在系统中的表示
ERP、项目管理系统、进度管理系统、物流系统、状态跟踪系统、批处理任务分解系统等软件系统中,大多数都会遇到一个类似描述任务的需求。
比如在批处理任务分解系统中,任务关系表需要记录父任务、子任务,也要记录父子任务这个关系。父任务和子任务都是任务,只在任务关系表中记录这些任务即可。而父子关系怎么描述呢?
数据结构中有树的概念,树可以表示父子关系。如下图所示一棵树:
可以至少有两种设计,来描述这棵树的节点间的父子关系。
1) 通过节点编码来表示父子关系。给每个节点编码加上父节点编码的前缀,而每一层节点的编码长度固定,节点如果没有父节点,则前缀为空。由以上规则可以定义以上九个节点的编码。
①:01
②:0101
③:0102
④:0103
⑤:010101
⑥:010102
⑦:010103
⑧:010304
⑨:010305
由上面的节点编码加上编码规则可以知道,①的子节点为②、③、④,而⑤、⑥、⑦为节点②的子节点,④为节点⑧、⑨的父节点。
2) 通过记录父节点的编码主键来表示父子关系。给每个节点附加一个“父节点”属性,指示它的父节点为哪一个节点。表格设计如下表1
表1
节点号 | 编码主键 | 父节点编码主键 |
① | 1 | - |
② | 2 | 1 |
③ | 3 | 1 |
④ | 4 | 1 |
⑤ | 5 | 2 |
⑥ | 6 | 2 |
⑦ | 7 | 2 |
⑧ | 8 | 4 |
⑨ | 9 | 4 |
由以上的附加“父节点编码主键”属性值可以清楚地知道一个节点的父节点。但是要知道一个节点是否有子节点,则只能通过搜索全表,查询哪个节点的“父节点编码主键”值与当前节点的“编码主键”是否相同。可以冗余设计表格,增加“第一个子节点编码主键”属性。表格设计如下:
表2
节点号 | 编码主键 | 父节点编码主键 | 第一个子节点编码主键 |
① | 1 | - | 2 |
② | 2 | 1 | 5 |
③ | 3 | 1 | - |
④ | 4 | 1 | 8 |
⑤ | 5 | 2 | - |
⑥ | 6 | 2 | - |
⑦ | 7 | 2 | - |
⑧ | 8 | 4 | - |
⑨ | 9 | 4 | - |
这样的设计,主要是方便查找一个节点是否有子节点,以及子节点的数据值。
3) 混合设计模式。即以上两种设计同时存在,这样能够提供更加完善的分解、查找模式,分解和合并节点。
任务表中不但需要描述父子关系,还要描述兄弟关系、堂兄弟关系、隔辈关系、堂父子关系。那么在以上两种设计中,稍加巧妙的拼接与转换,即可实现另外这些关系的描述。若你想继续钻研这些关系,请花点时间思考一下。