欢迎来到天天文库
浏览记录
ID:9797254
大小:61.86 KB
页数:15页
时间:2018-05-10
《收集常用数据库设计技巧》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、收集常用数据库设计技巧一、树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况。当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构:类别表_1(Type_table_1)名称 类型 约束条件 说明type_id int 无重复 类别标识,主键type_name
2、char(50) 不允许为空 类型名称,不允许重复type_father int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值 这样的设计短小精悍,完全满足3NF,而且可以满足用户的所有要求。是不是这样就行呢?答案是NO!Why? 我们来估计一下用户希望如何罗列出这个表的数据的。对用户而言,他当然期望按他所设定的层次关系一次罗列出所有的类别,例如这样:总类别 类别1 类别1.1 类别1.1.1 类别1.2 类别2 类别2.1 类别3 类别3.1 类别3.2 …… 看看为了实
3、现这样的列表显示(树的先序遍历),要对上面的表进行多少次检索?注意,尽管类别1.1.1可能是在类别3.2之后添加的记录,答案仍然是N次。这样的效率对于少量的数据没什么影响,但是日后类型扩充到数十条甚至上百条记录后,单单列一次类型就要检索数十次该表,整个程序的运行效率就不敢恭维了。或许第二类程序员会说,那我再建一个临时数组或临时表,专门保存类型表的先序遍历结果,这样只在第一次运行时检索数十次,再次罗列所有的类型关系时就直接读那个临时数组或临时表就行了。其实,用不着再去分配一块新的内存来保存这些数据,只要对数据表进行一定的扩充,再对添加类型的数量进行一下约束就行了,要完成上
4、面的列表只需一次检索就行了。下面是扩充后的数据表结构:类别表_2(Type_table_2)名称 类型 约束条件 说明type_id int 无重复 类别标识,主键type_name char(50) 不允许为空 类型名称,不允许重复type_father int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值type_layer char(6)
5、 限定3层,初始值为000000 类别的先序遍历,主要为减少检索数据库的次数 按照这样的表结构,我们来看看上面例子记录在表中的数据是怎样的:type_id type_name type_father type_layer1 总类别 0 0000002 类别1 1 0100003 类别1.1 2
6、 0101004 类别1.2 2 0102005 类别2 1 0200006 类别2.1 5 0201007 类别3 1 0300008 类别3.1 7 0301009
7、 类别3.2 7 03020010 类别1.1.1 3 010101…… 现在按type_layer的大小来检索一下:SELECT*FROMType_table_2ORDERBYtype_layer列出记录集如下:type_id type_name type_father type_layer1 总类别 0
此文档下载收益归作者所有