项目中树的设计

 

62.  现在开始做分销商这一块的功能,主要有一个树形的功能。这个树形结构功能我们做得不是很好,不太灵活 ,关于这个树形结构有一些组件,做的比较好。在这个项目里不使用。

 

 

63.  先来看一下,树的几种设计方式:

1,不带冗余字段,id,pid    一般使用id,pid已经足够了。但是这种方式在

遍的时候有一个效率的问题,因为我要看一下下面有没有结点。

 

 

2, 带冗余字段  id,pid,isleaf,childrencount     这种方式:通常引入一个看它是不是叶子,我也可以加入他有多少孩子。这样我容易算出来 ,我拿到这个字段一看,下面有多少孩子我知道了。而没有必要每次算,

 

 

3, 采用固定的字符串,00  01 001 0001

    1.    00所有分销商

    2.    01华北区

    3.    001北京市

    4.    0001北京医药股份有限公司

 

 

 

 

64.  再来看一下这张分销商信息的表,这个一个自连接,在这里有一个pid,pid里面的值全部来源于id,

 

 

65.  分销商在这棵树形结构上都 是平等的。比如说北京市下面有北京医药股份有限公司,这可能是一级分销商,如果还有一个二级分销商也是在北京市下面,不会在北京医药股份有限公司下面还显示二级。

 

 

66.  我们分销商要属于一个区域,华北区,北京市,这些都是区域,区域下面挂了分销商,我们的设计是这样的,就放在一张表里面,这张表里面既放了区域又放了分销商,以前 提到过,这样不太好,冗余量太大,因为假如说是区域的话,它有名称,id,pid,那级别,分销商代码,其它的都没有,那么就都冗余了,         另外还有一个终端客户表,里面也有一个树形结构要做,其实和分销商差不多,那么在终端客户里面你又会重复写区域相关的记录,如北京 ,,,,,,当时 说过最好是把树形结构区域抽出来。区域是一个树形结构,分销商只属于它,所以单独建一张分销商表,再抽一个区域这样会好点。分销商,终端都不是树形结构,只要把这两个往上挂就可以了。区域是一个树形结构,但是我们没有采用这种方式,就放一张表里面,因为放一张表里面,大家要处理一些事情,有点麻烦,为了给大家增加一点难度,左连接,右连接,

 

 

/**

* 得到顶级目录

* @param regionColumnId

* @return

*/

public int getMyTopRegionColumnId(int regionColumnId){

RegionColumn regionColumn = getBeanById(regionColumnId);

if(regionColumn.getParentId() == 0){

return regionColumn.getRegionColumnId();

} else {

return getMyTopRegionColumnId(regionColumn.getParentId());

}

}

 

 

 

/** 得到栏目树 **/

public String getCateTree(String tree, int rootColumnId,int regionId) {

RegionColumn rootBean = regionColumnDAO.getBeanById(rootColumnId);

StringBuffer treeStrBuf = new StringBuffer();

if (rootBean != null) {

treeStrBuf.append(tree + ".add(");

treeStrBuf.append(rootColumnId);

treeStrBuf.append(",-1,");

treeStrBuf.append("\"<span  οnclick=showLoad(" + rootColumnId + ",'"

+ rootBean.getName() + "')>" + rootBean.getName()

+ "</span>\",");

treeStrBuf.append("'/admin/article/list.htm?cata_id=" + rootColumnId

+ "',");

treeStrBuf.append("''," + "'body_iframe');\r\n");

List<RegionColumn> subList = getSubCategory(rootColumnId, 0, regionId);

if (subList != null && subList.size() > 0) {

dumpCatalogTree(tree, subList, treeStrBuf, rootColumnId,regionId);

}

}

return treeStrBuf.toString();

}

public String getCateTree(String tree, int regionId){

return this.getCateTree(tree, 0, regionId);

}

 

/** 递归得到树 **/

private void dumpCatalogTree(String tree, List<RegionColumn> lisBean,

StringBuffer treeStrBuf, int parentId,int regionId) {

for (RegionColumn bean : lisBean) {

treeStrBuf.append(tree + ".add(");

treeStrBuf.append(bean.getRegionColumnId());

treeStrBuf.append("," + parentId + ",");

treeStrBuf.append("\"<span  οnclick=showLoad("

+ bean.getRegionColumnId() + ",'" + bean.getName() + "')>"

+ bean.getName() + "</span>\",");

if (bean.getIdentifier() != null

&& bean.getIdentifier().equals("qzz"))

treeStrBuf.append("'/admin/article/getResumeByRegionId.htm',");

else if (bean.getIdentifier() != null

&& bean.getIdentifier().equals("zpr"))

treeStrBuf.append("'/admin/article/getEmployByRegionId.htm',");

else

treeStrBuf.append("'/admin/article/list.htm?cata_id="

+ bean.getRegionColumnId() + "',");

treeStrBuf.append("''," + "'body_iframe','','',false);\r\n");

List<RegionColumn> subList = getSubCategory(bean

.getRegionColumnId(), 0,regionId);

if (subList != null && subList.size() > 0) {

dumpCatalogTree(tree, subList, treeStrBuf, bean

.getRegionColumnId(),regionId);

}

 

}

}

 

public RegionColumn getRegionColumn(int id) {

return regionColumnDAO.getBeanById(id);

}

 

public List<RegionColumn> getSubCategory(int cataId, int rootCloumnId,int regionId) {

return regionColumnDAO.getSubCategory(cataId, rootCloumnId,regionId);

}

 

public int getTopRegionColumnId(int cata_id) {

return regionColumnDAO.getTopRegionColumnId(cata_id);

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值