由一棵已知树来设计对应的数据表格结构
@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结构,可想到如下的结构:
TableName:Tree
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、修改方案:
首先修改表格结构,增加一个编码字段:
TableName:Tree
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