您的位置:首页 > 其它

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

2009-11-13 10:30 330 查看
由一棵已知树来设计对应的数据表格结构
@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: