最近的一个项目中,因为一个数据库表结构的设计,引发了长达半年的激烈讨论。
需求很简单:
需要设计一个支持无限层级的,有顺序的存储方式。支持对树结构中节点的曾、删、改以及整棵树的复制。
观点主要有两个,一方是认为,设计一个id/pid的经典结构(但是这里为了保存同一层级不同子节点的顺序,子节点还需要同时保存自己的order信息),另一方认为,每个节点保存一个数组,数组内容为子节点的有序id。
针对这两个设计,在可以实现所有需求的前提下,从不同角度对比下到底有什么优劣:
步骤 | 经典结构 | 数组结构 |
---|---|---|
1 | 插入新节点 | 插入新节点 |
2 | 对排在新节点后的节点的order加1 | 更新父节点数组 |
步骤 | 经典结构 | 数组结构 |
---|---|---|
1 | 删除节点包括子节点 | 删除节点包括子节点 |
2 | 对排在新节点后的节点的order-1 | 更新父节点数组 |
步骤 | 经典结构 | 数组结构 |
---|---|---|
1 | 遍历所有节点,构造节点字典 | 遍历所有节点,构造节点字典 |
2 | 遍历所有节点,将自己插入到父节点children字段中 | 遍历所有节点,获取所有的子节点,插入自己的children字段中 |
3 | 深度\广度遍历树,对每个节点children字段中的节点排序 | 无 |
经典结构、数组结构中,均可以通过增加一个冗余字段,使用SELECT INTO
达到高效的复制。
所以,总体来说,我觉得数组结构是一个更优的选择。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。