mysql树形结构表设计(PathEnumerations,ClosureTable)效果
⾸先看下返回到前台的效果:
下⾯是返回给前台的json:
{
"code": 1,
"data": [
{
"children": [
{
"children": [
{
"id": 76,
"parent_role_id": 74,赛龙舟的图片
"parentname": "管理员1号",
"role_name": "群员1号",
"role_type": "111"
},
{
"id": 77,
"parent_role_id": 74,
乃佛
"parentname": "管理员1号",
"role_name": "群员2号",
"role_type": "2222"
}
],
"id": 74,
"parent_role_id": 73,
"parentname": "群主",
"role_name": "管理员1号",
"role_type": "111"
},
{
"children": [
{
"id": 78,
"parent_role_id": 75,
"parentname": "管理员2号",
"role_name": "群员3号",
"role_type": "333"
}
],
"id": 75,
"parent_role_id": 73,
"parentname": "群主",
"role_name": "管理员2号",
"role_type": "222"
}
],
"id": 73,
"parent_role_id": 0,
"role_name": "群主",
"role_type": "111"
}
]
,
"msg": "执⾏成功"袋鼠品牌
}
引⾔
⼀般⽐较普遍的就是四种⽅法:(具体见 SQL Anti-patterns这本书) Adjacency List:每⼀条记录存parent_id
Path Enumerations:每⼀条记录存整个tree path经过的node枚举 Nested Sets:每⼀条记录存 nleft 和 nright
Closure Table:维护⼀个表,所有的tree path作为记录进⾏保存。
各种⽅法的常⽤操作代价见下图
作者:卢钧轶
链接:
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
正⽂
如上所见,我们选择⽅案2和⽅案4来进⾏设计
⽅案2(Path Enumerations)
因为我使⽤的是⽅案4,所以⽅案2我就直接引⽤别⼈的代码。
详情可查看
简单说说,图中的path存的是每个层级的关系,像第6条记录的意思就是我的上级是5,5的上级是2,2的上级是1,其他记录同理可得。这种⽅法乍看很清晰很明了,但其实维护是⽐较难维护的,⽽且有可能会产⽣脏数据,毕竟你所维护的都是通过字符串来维护
不做过多介绍,因为这个⽅案确实是最简单的,如上所说,每种⽅案都适⽤不同业务。
⽅案4(Closure Table)
这个⽅案我也是参考上⾯的博客,可以先看看他的表结构图
下⾯是本⽂的表结构:
这是⾓⾊表,包含⾓⾊名称,⽗⾓⾊ID
如何删除qq好友
这是⾓⾊关系表,ancestor_id是⽗级和祖⽗级ID,level是当前⾓⾊相对ancestor_id⽽⾔的层次,rold_id则是⾓⾊ID
举个例⼦,群主这个⾓⾊是属于最顶层,那么只插⼊⼀条关联数据,表⽰⾃⾝,即 73,0,73
一公顷是多少平方千米
管理员1号是属于群主下⾯的⼀个⾓⾊,那么⾸先同样需要先创建⼀个表⽰⾃⾝的数据,即74,0,74 ,然后创建管理员1号和群主关联的数据,即73,1,74 这⾥的1就是代表管理员1号对于群主⽽⾔,他是⼀级直属关系,所以level为1
规律
每个⼦⾓⾊都需要和⾃⾝以及所有的上级⾓⾊关联,假设有5个等级,A1-A2-A3-A4-A5,当创建A5的时候,先插⼊⾃⾝数据,然后循环所有上级进⾏关联。
代码部分
public class RoleTree {
private Integer id;
private Integer ancestor_id;
private Integer level;
private Integer role_id;
public Integer getId() {
return id;
拔河规则}
public void tId(Integer id) {
this.id = id;
身份证到期怎么办
}
public Integer getAncestor_id() {
洋葱的做法return ancestor_id;
}
public void tAncestor_id(Integer ancestor_id) {
this.ancestor_id = ancestor_id;
}
public Integer getLevel() {
return level;
}
public void tLevel(Integer level) {
this.level = level;
}
public Integer getRole_id() {
return role_id;
}
public void tRole_id(Integer role_id) {
}
}
添加操作代码: