由一棵已知树来设计对应的数据表格结构
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
但是。如果采用这个结构,那么在查询表格的数据时,必须要根据fatherid来确定父子关系,因此,在获取到tree的列表list之后,就需要递归循环该list从而组合出上面的JSON结构。
此方法已经完全可以解决问题。
但是,由于使用了多层递归循环,因此,如果树的层级越多,则循环的次数越多。
那么,如何能够减少循环次数呢?
2、修改方案:
首先修改表格结构,增加一个编码字段:
TableName:Tree
这样,在增加了code字段之后,每次查询时,我们只需要按着code来排序得到tree的列表list,然后在循环list的每条记录时(这次只需要循环一次list,不再有递归循环存在),根据code的长度来判断树的父子关系即可。
当然,采用这种方式,增加了增删改的处理复杂程度,增删改时,必须要同时处理code的数据,保证其正确性。
3、讨论:
1>一般来说,tree查询的次数并不多,也即平时tree的数据相对稳定,不会经常修改,那么则应该考虑将数据静态化,例如生成静态js或者json数据。
因此,这种情况,可以选择上面的初始方案。毕竟,增删改的编码量太大或者逻辑太复杂,做程序也麻烦。
2>二般来说,tree变动很频繁,查询次数很多,就要按着“以查询优先、增删改为次”的原则来设计了。这种情况,则优选上面的修改方案。
4、延伸:
还有更好的方案吗?
根据上面的抛砖,希望能够引玉现身。。。。。 ^_^
@forandever 2009-11-13
@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 |
此方法已经完全可以解决问题。
但是,由于使用了多层递归循环,因此,如果树的层级越多,则循环的次数越多。
那么,如何能够减少循环次数呢?
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的数据,保证其正确性。
3、讨论:
1>一般来说,tree查询的次数并不多,也即平时tree的数据相对稳定,不会经常修改,那么则应该考虑将数据静态化,例如生成静态js或者json数据。
因此,这种情况,可以选择上面的初始方案。毕竟,增删改的编码量太大或者逻辑太复杂,做程序也麻烦。
2>二般来说,tree变动很频繁,查询次数很多,就要按着“以查询优先、增删改为次”的原则来设计了。这种情况,则优选上面的修改方案。
4、延伸:
还有更好的方案吗?
根据上面的抛砖,希望能够引玉现身。。。。。 ^_^
@forandever 2009-11-13
相关文章推荐
- SQLSERVER和ORACLE数据类型对应关系详解和对应表格
- 数据结构课程设计 题目1 活期储蓄程序
- 数据结构课程设计
- C++ 与 C#数据结构类型对应关系表 (转)
- 数据结构课程设计——题目四电话模拟
- 清空表格数据,不清除表格结构
- 数据结构课程设计
- 如何利用ccform自定义表单来增加自己的控件,关于Sys_FrmEle表结构与数据存储设计?
- 数据结构课程设计---学生信息管理系统
- 数据结构课程设计---教学任务安排系统
- 数据结构课程设计——通讯录系统设计(C语言)
- 数据表结构的设计与性能优化
- 数据结构课程设计(题2)
- 数据结构课程设计报告
- 数据结构课程设计运行图片
- 数据结构课程设计
- 【数据结构课程设计】信管1133何景涛201311671308
- 数据结构拾遗(3) --红黑树的设计与实现(下)
- 数据结构课程设计——源代码
- 数据结构课程设计 表达式类型的实现