由一棵已知树来设计对应的数据表格结构

 

由一棵已知树来设计对应的数据表格结构

@for&ever 2009-11-13

 

最近,看了mootools (http://mootools.net/ )的一个开源tree实现 —— mif.tree (http://miftree.googlecode.com ). 这棵树结构很好,因此决定使用。但是由于他没有基于db的实现,只得根据他的数据结构自己设计DB表格。

 

一、问题:

现在,树mif.tree,采用如下的JSON结构布局:

[

         {

                   "property": {

                            "id": 1,

                            "name": "a"

                   },

                   "children":[

                            {

                                     "property": {

                                               "id": 2,

                                               "name": "b"

                                     },

                                     "children":[

                                               {

                                                        "property": {

                                                                 "id": 4,

                                                                 "name": "d"

                                                        }

                                               },

                                               {

                                                        "property": {

                                                                 "id": 5,

                                                                 "name": "e"

                                                        }

                                               },

                                               {

                                                        "property": {

                                                                 "id": 6,

                                                                 "name": "f"

                                                        }

                                               }

                                     ]

                            },

                            {

                                     "property": {

                                               "id": 3,

                                               "name": "c"

                                     },

                                     "children":[

                                               {

                                                        "property": {

                                                                 "id": 7,

                                                                 "name": "g"

                                                        },

                                               }

                                     ]

                            }

                   ]

         },

]

 

现在,请设计一个数据表格,来通过DB保存这棵树。

表格结构要求尽量的设计为遵循“以查询优先、增删改为次”的原则。

有没有比较好的思路?要求循环少,逻辑好的算法。

 

二、解决方案讨论:

1、初始方案:

由上面的JSON结构,可想到如下的结构:

 

TableNameTree

id

name

fatherid

1

a

0

2

b

1

3

c

1

4

d

2

5

e

2

6

f

2

7

g

3

 

但是。如果采用这个结构,那么在查询表格的数据时,必须要根据fatherid来确定父子关系,因此,在获取到tree的列表list之后,就需要递归循环该list从而组合出上面的JSON结构。

此方法已经完全可以解决问题。

 

但是,由于使用了多层递归循环,因此,如果树的层级越多,则循环的次数越多。

那么,如何能够减少循环次数呢?

 

2、修改方案:

首先修改表格结构,增加一个编码字段:

 

TableNameTree

 

id

name

fatherid

code

1

a

0

001

2

b

1

001001

3

c

1

001002

4

d

2

001001001

5

e

2

001001002

6

f

2

001001003

7

g

3

001002001

 

这样,在增加了code字段之后,每次查询时,我们只需要按着code来排序得到tree的列表list,然后在循环list的每条记录时(这次只需要循环一次list,不再有递归循环存在),根据code的长度来判断树的父子关系即可。

当然,采用这种方式,增加了增删改的处理复杂程度,增删改时,必须要同时处理code的数据,保证其正确性。

 

 

3、讨论:

1>一般来说,tree查询的次数并不多,也即平时tree的数据相对稳定,不会经常修改,那么则应该考虑将数据静态化,例如生成静态js或者json数据。

因此,这种情况,可以选择上面的初始方案。毕竟,增删改的编码量太大或者逻辑太复杂,做程序也麻烦。

 

2>二般来说,tree变动很频繁,查询次数很多,就要按着“以查询优先、增删改为次”的原则来设计了。这种情况,则优选上面的修改方案。

 

 

4、延伸:

还有更好的方案吗?

根据上面的抛砖,希望能够引玉现身。。。。。 ^_^

 

@forandever 2009-11-13

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值