数据库设计案例分析

本文探讨了数据库设计中处理树型关系数据表的优化方法,通过增加`type_layer`字段提高检索效率。同时,介绍了商品信息表设计案例,避免不断新增字段导致的数据库膨胀,提出了商品额外属性表和额外信息表的解决方案。文章还讨论了多用户权限管理的架构设计,提出采用用户组和功能表以灵活控制权限。最后,讨论了在m:n关系中如何简洁地处理批量操作,通过修改借阅记录表实现批量借阅信息查询。文章强调在适当情况下增加冗余数据可以简化开发和提高效率。
摘要由CSDN通过智能技术生成

一、树型关系的数据表
  不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况。当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构:

类别表_1(Type_table_1)
名称     类型    约束条件   说明
type_id   
   int        无重复     类别标识,主键
type_name
   char(50)    不允许为空   类型名称,不允许重复
type_father   int         
不允许为空   该类别的父类别标识,如果是顶节点的话设定为某个唯一值

  这样的设计短小精悍,完全满足3NF,而且可以满足用户的所有要求。是不是这样就行呢?答案是NOWhy

  我们来估计一下用户希望如何罗列出这个表的数据的。对用户而言,他当然期望按他所设定的层次关系一次罗列出所有的类别,例如这样:
总类别
  类别1
    类别1.1
      类别1.1.1
    类别1.2
  类别2
    类别2.1
  类别3
    类别3.1
    类别3.2
  ……

  看看为了实现这样的列表显示(树的先序遍历),要对上面的表进行多少次检索?注意,尽管类别1.1.1可能是在类别3.2之后添加的记录,答案仍然是N次。这样的效率对于少量的数据没什么影响,但是日后类型扩充到数十条甚至上百条记录后,单单列一次类型就要检索数十次该表,整个程序的运行效率就不敢恭维了。或许第二类程序员会说,那我再建一个临时数组或临时表,专门保存类型表的先序遍历结果,这样只在第一次运行时检索数十次,再次罗列所有的类型关系时就直接读那个临时数组或临时表就行了。其实,用不着再去分配一块新的内存来保存这些数据,只要对数据表进行一定的扩充,再对添加类型的数量进行一下约束就行了,要完成上面的列表只需一次检索就行了。下面是扩充后的数据表结构:

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

  按照这样的表结构,我们来看看上面例子记录在表中的数据是怎样的:

type_id      type_name          type_father          type_layer
            
总类别               0                 000000
            
类别               1                 010000
            
类别1.1              2                 010100
            
类别1.2              2                 010200
            
类别               1                 020000
            
类别2.1              5                 020100
            
类别               1                 030000
            
类别3.1              7                 030100
            
类别3.2              7                 030200
10            
类别1.1.1            3                 010101
……

  现在按type_layer的大小来检索一下:SELECT * FROM Type_table_2 ORDER BY type_layer

列出记录集如下:

type_id      type_name          type_father          type_layer
            
总类别               0                 000000
            
类别               1                 010000
            
类别1.1              2                 010100
10            
类别1.1.1            3                 010101
            
类别1.2              2                 010200
            
类别               1                 020000
            
类别2.1              5   

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值