收集常用数据库设计技巧

上传人:博****1 文档编号:508418722 上传时间:2023-02-14 格式:DOC 页数:16 大小:61.86KB
返回 下载 相关 举报
收集常用数据库设计技巧_第1页
第1页 / 共16页
收集常用数据库设计技巧_第2页
第2页 / 共16页
收集常用数据库设计技巧_第3页
第3页 / 共16页
收集常用数据库设计技巧_第4页
第4页 / 共16页
收集常用数据库设计技巧_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《收集常用数据库设计技巧》由会员分享,可在线阅读,更多相关《收集常用数据库设计技巧(16页珍藏版)》请在金锄头文库上搜索。

1、收集常用数据库设计技巧一、树型关系的数据表不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某 些子类又有子类这样的情况。当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此 时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构:类别表_1(Type_table_1)名称类型约束条件说明type_id int 无重复 类别标识,主键type_name char(50) 不允许为空 类型名称,不允许重复type_father

2、 int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值这样的设计短小精悍,完全满足3NF,而且可以满足用户的所有要求。是不是这样就行呢?答案是NO!Why?我们来估计一下用户希望如何罗列出这个表的数据的。对用户而言,他当然期望按他所设定的层次关系一次罗列出所有的类别,例如这样:总类别类别1类别1.1类别1.1.1类别1.2类别2类别2.1类别3类别3.1类别3.2看看为了实现这样的列表显示(树的先序遍历),要对上面的表进行多少次检索?注意,尽管类别1.1.1可能是在类别3.2之后添加的记录,答案 仍然是N次。这样的效率对于少量的数据没什么影响,但是日后类型扩充到数十条甚至上

3、百条记录后,单单列一次类型就要检索数十次该表,整个程序的运行效率就 不敢恭维了。或许第二类程序员会说,那我再建一个临时数组或临时表,专门保存类型表的先序遍历结果,这样只在第一次运行时检索数十次,再次罗列所有的类型 关系时就直接读那个临时数组或临时表就行了。其实,用不着再去分配一块新的内存来保存这些数据,只要对数据表进行一定的扩充,再对添加类型的数量进行一下 约束就行了,要完成上面的列表只需一次检索就行了。下面是扩充后的数据表结构:类别表_2(Type_table_2)名称类型约束条件 说明type_id int 无重复 类别标识,主键type_name char(50) 不允许为空 类型名称,

4、不允许重复type_father int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值type_layer char(6) 限定3层,初始值为000000 类别的先序遍历,主要为减少检索数据库的次数按照这样的表结构,我们来看看上面例子记录在表中的数据是怎样的:type_id type_name type_father type_layer1 总类别 0 0000002 类别1 1 0100003 类别1.1 2 0101004 类别1.2 2 0102005 类别2 1 0200006 类别2.1 5 0201007 类别3 1 0300008 类别3.1 7 030100

5、9 类别3.2 7 03020010 类别1.1.1 3 010101现在按type_layer的大小来检索一下:SELECT * FROM Type_table_2 ORDER BY type_layer列出记录集如下:type_id type_name type_father type_layer1 总类别 0 0000002 类别1 1 0100003 类别1.1 2 01010010 类别1.1.1 3 0101014 类别1.2 2 0102005 类别2 1 0200006 类别2.1 5 0201007 类别3 1 0300008 类别3.1 7 0301009 类别3.2 7

6、030200现在列出的记录顺序正好是先序遍历的结果。在控制显示类别的层次时,只要对type_layer字段中的数值进行判断,每2位一组,如大于0则 向右移2个空格。当然,我这个例子中设定的限制条件是最多3层,每层最多可设99个子类别,只要按用户的需求情况修改一下type_layer的长度和位 数,即可更改限制层数和子类别数。其实,上面的设计不单单只在类别表中用到,网上某些可按树型列表显示的论坛程序大多采用类似的设计。或许有人认为,Type_table_2中的type_father字段是冗余数据,可以除去。如果这样,在插入、删除某个类别的时候,就得对 type_layer 的内容进行比较繁琐的判

7、定,所以我并没有消去type_father字段,这也正符合数据库设计中适当保留冗余数据的来降低程序复杂度的原则,后面我会举 一个故意增加数据冗余的案例。二、商品信息表的设计假设你是一家百货公司电脑部的开发人员,某天老板要求你为公司开发一套网上电子商务平台,该百货公司有数千种 商品出售,不过目前仅打算先在网上销售数十种方便运输的商品,当然,以后可能会陆续在该电子商务平台上增加新的商品出售。现在开始进行该平台数据库的商品 信息表的设计。每种出售的商品都会有相同的属性,如商品编号,商品名称,商品所属类别,相关信息,供货厂商,内含件数,库存,进货价,销售价,优惠价。你 很快就设计出4个表:商品类型表(

8、Wares_type),供货厂商表(Wares_provider),商品信息表(Wares_info):商品类型表(Wares_type)名称类型约束条件 说明type_id int 无重复 类别标识,主键type_name char(50) 不允许为空 类型名称,不允许重复type_father int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值type_layer char(6) 限定3层,初始值为000000 类别的先序遍历,主要为减少检索数据库的次数供货厂商表(Wares_provider)名称类型约束条件 说明provider_id int 无重复 供货商标识,

9、主键provider_name char(100) 不允许为空 供货商名称商品信息表(Wares_info)名称 类型约束条件 说明wares_id int 无重复 商品标识,主键wares_name char(100) 不允许为空 商品名称wares_type int 不允许为空 商品类型标识,和Wares_type.type_id关联wares_info char(200) 允许为空 相关信息provider int 不允许为空 供货厂商标识,和Wares_provider.provider_id关联setnum int 初始值为1 内含件数,默认为1stock int 初始值为0 库存,

10、默认为0buy_price money 不允许为空 进货价sell_price money 不允许为空 销售价discount money 不允许为空 优惠价你拿着这3个表给老板检查,老板希望能够再添加一个商品图片的字段,不过只有一部分商品有图片。OK,你在商品信息表(Wares_info)中增加了一个haspic的BOOL型字段,然后再建了一个新表商品图片表(Wares_pic):商品图片表(Wares_pic)名称 类型约束条件 说明pic_id int 无重复 商品图片标识,主键wares_id int 不允许为空 所属商品标识,和Wares_info.wares_id关联pic_address char(200) 不允许为空 图片存放路径程序开发完成后,完全满足老板目前的要求,于是正式启用。一段时间

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号