最近,做项目中用到了element提供的tree形控件。
首先,el-tree所展示的树形结构是什么样的呢?
接下来,要展示这样的属性结构需要什么样的数据格式呢?
一个json串:
[{ id: 1,
label: '一级 1’,
children: [{
id: 4,
label: '二级 1-1’,
children: [{
id: 9,
label: '三级 1-1-1’
}, {
id: 10,
label: '三级 1-1-2’
}]
}]
我们举得这个例子是通过id,label,children三个属性锁定一个树形节点的位置
那么,我们的项目是通过什么锁定位置的呢?
id,parentId(父节点id),priority(父节点id相同,说明节点在同一层级,同一层级间的排序通过priority优先级体现)
那么,我们怎么把它存储到数据库呢?
背景:添加项目过程中,可以选择父项目,也可以不选
存储:
//判断创建的项目是否选择了父项目
//如果选择了父项目
if(null!=protectModel.getParentId() && ""!=protectModel.getParentId()){
//查询t_project表中是否存在id为该ParentId的节点
String parentId=addProjectDao.queryParentId(protectModel.getParentId());
//如果存在,说明该项目为我们创建的项目的父项目
if(""!=parentId && null!=parentId){
//获取数据库中parentId为该ParentId的节点优先级的最大值
String leastPriority=addProjectDao.queryPriority(protectModel.getParentId());
//如果优先级的最大值是null
if(leastPriority==null){
//设置优先级最大值为常量0
leastPriority= Constant.Zero;
}
//设置当前项目的优先级为当前优先级的最大值+1
protectModel.setPriority(Integer.parseInt(leastPriority)+ Constant.OnePriority);
}
}
else{
//如果没有选择父项目,那说明当前项目为父项目,获取父项目的优先级的最大值
String leastPriority=addProjectDao.queryParentPriority(protectModel.getParentId());
//如果父项目优先级的最大值为null
if(leastPriority==null){
//设置父项目的优先级为常量0
leastPriority=Constant.Zero;
}
//设置当前项目的优先级为父项目的优先级+1
protectModel.setPriority(Integer.parseInt(leastPriority)+ Constant.OnePriority);
}
//通过雪花算法创建项目id
protectModel.setId(IdWorker.getIdStr());
我们存储属性结构的方法选择的是一个节点对应数据库一条数据的形式,那么,还有其他的存储方式么?
当然啦---嵌套式存储,如何理解?
就是将一整棵树以json串的形式存储到数据库,也就是仅仅对应数据库一条数据。
感觉有点大开眼界的感觉,嘿嘿~~~
没有对比就没有伤害,两种存储方式,有什么差别呢?
很明显的一点,就是占用数据库几条数据的问题:多对一
然后就是,如果我的树允许拖拽,那么更新的时候,一个节点对应一条数据的形式只需要更新我们修改了的节点;嵌套式存储只能更新一整个json串,这样理解的话,经常可能会更新的树的存储用一个节点对应一条数据的方式好像更合适呢!!!(仅代表个人观点,随时欢迎大家指正^○^)