无限树型表结构的通用设计,最佳字段设计方案如下:
- 父结点ID:parent_id
- 结点ID路径:id_path
- 结点层级:level
- 是否有子结点:has_children
树型结构的表设计,理解到的,可以有多种设计方式:邻接表、枚举路径、嵌套集、闭包表。
设计方式 | 表数量 | 查询子 | 查询树 | 插入 | 删除 | 引用完整性 |
---|---|---|---|---|---|---|
邻接表 | 1 | 简单 | 简单 | 简单 | 简单 | 是 |
枚举路径 | 1 | 简单 | 简单 | 简单 | 简单 | 否 |
嵌套集 | 1 | 困难 | 简单 | 困难 | 困难 | 否 |
闭包表 | 2 | 简单 | 简单 | 简单 | 简单 | 是 |
1、邻接表:最常规、最方便的设计。在递归查询的帮助下,使得邻接表的查询更加高效。
2、枚举路径:少用的设计。能够很直观地展示出祖先到后代之间的路径,但由于不能确保引用完整性,使得这个设计比较脆弱。枚举路径也使得数据的存储变得冗余。
3、嵌套集:很聪明的设计。但不能确保引用完整性,并且只能使用于查询性能要求较高,而其他要求一般的场合使用它。
4、闭包表:最通用的设计。并且最灵活,易扩展,并且一个节点能属于多棵树,能减少冗余的计算时间。但它要求一张额外的表来存储关系,是一个空间换取时间的方案。
参考文章: 逻辑数据库设计 – 单纯的树(递归关系数据) + 查看本文章缓存图
近期评论