关于数据库设计的思考(二)
我设计数据库只考虑到可以正确存取数据就可以了,参考了人家在网上写的一些经验总结,我还应该考虑到怎样可以方便的存取数据。特别是如何可以高效地查询到需要的数据。现在新办公系统数据库设计表之间的关联关系太多了,当数据大时读取数据时速度将会出现很大的问题。所以在数据库设计阶段,要设计好怎样方便数据的存取。
分析:
例子1(树形关系)
类别表(Type_table)
名称 类型 约束条件 说明
type_id int 无重复 类别标识,主键
type_name char(50) 不允许为空 类型名称,不允许重复
type_father int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值
type_layer char(6) 限定3层,初始值为000000 类别的先序遍历,主要为减少检索数据库的次数
如果是我设计数据表,我一定不会考虑到添加最后一个字段(type_layer) 。因为这个字段仅用来加快查询的速度,没有这个字段对数据的存
取也没有太大的影响。只不过当数据越来越宠大的时候,问题就出现了,这时查询速度将会是一个很大的问题。
例子2(分折字段)
IP 地址,分折成一个字段记录IP段,一个字段记录IP末位数。这样的设计可以方便用户查询IP段的信息。
例子3(数据字典)
每一个模块在插入记录时都或多或少相同的选项,如果每一张表都建一个对应的选项表的话,维护进来工作量相当大,所有可以把这些小数据量的选项存储到一张表,这张表就叫做数据字典表。
例子4
现时新项目有很多型号字段,而型号又是按类别来划分的,关联到类别表。对于这种二级或者更多三级以上等等,如果我们设计数据库时,在某一数据表只保存型号字段,这时如果我们要找出型号类型,要 join 连接到型号表,再在型号表找出里面的类别字段。这样的设计会导致 select 效率很慢,当只是二级可能效率慢还不是很明显,三级以上时,这个问题就很明显了。为了解决效率问题,所以我们在设计数据库的时候要在数据表同时保存型号字段和类别字段。这时在这个表中类别字段是一个冗余字段,虽然通过添加冗余字段避免一些连接查询,但又产生一个新的问题:怎样保证数据库数据的一致性?看来鱼和熊掌不可兼得。
我在这个例子的疑问,和如下一个同学论坛里的问题是如出一辙的。
《有关多表查询的提高效率的方法》 ------ http://topic.csdn.net/u/20091120/11/f8e339af-0363-407b-bbfa-030558f8f713.html
在研究数据库的设计时看了很多相关的博文。
在这里一一列出来,权当是一个记录,以后想找相关的文章,不用再 google 满世界的找。
《根据实例说数据库设计(一)—— 人员管理》 ------ http://www.cnblogs.com/jyk/archive/2009/01/21/1379241.html
《数据库主键设计之思考》 ------ http://www.cnblogs.com/tintown/archive/2005/03/02/111459.html
《数据库构思与设计规范》 ------ http://www.cnblogs.com/bhtfg538/archive/2009/08/05/1539993.html
《关于数据库设计中,冗余字段使用的问题》 ------ http://topic.csdn.net/t/20020204/17/518698.html
《对于两个都有上万行的两个表...》 ------ http://topic.csdn.net/t/20050803/12/4185742.html