知识大全 新手浅谈数据库中的设计技巧(一)

Posted

篇首语:一年之计在于春,一日之计在于晨。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 新手浅谈数据库中的设计技巧(一)相关的知识,希望对你有一定的参考价值。

  说到数据库 我认为不能不先谈数据结构 年 在我初入大学学习计算机编程时 当时的老师就告诉我们说 计算机程序=数据结构+算法 尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主 但我还是深深赞同 年前老师的告诉我们的公式 计算机程序=数据结构+算法 面向对象的程序开发 要做的第一件事就是 先分析整个程序中需处理的数据 从中提取出抽象模板 以这个抽象模板设计类 再在其中逐步添加处理其数据的函数(即算法) 最后 再给类中的数据成员和函数划分访问权限 从而实现封装     数据库的最初雏形据说源自美国一个奶牛场的记账薄(纸质的 由此可见 数据库并不一定是存储在电脑里的数据^_^) 里面记录的是该奶牛场的收支账目 程序员在将其整理 录入到电脑中时从中受到启发 当按照规定好的数据结构所采集到的数据量大到一定程度后 出于程序执行效率的考虑 程序员将其中的检索 更新维护等功能分离出来 做成单独调用的模块 这个模块后来就慢慢发展 演变成现在我们所接触到的数据库管理系统(dbms)——程序开发中的一个重要分支     下面进入正题 首先按我个人所接触过的程序给数据库设计人员的功底分一下类     1 没有系统学习过数据结构的程序员 这类程序员的作品往往只是他们的即兴玩具 他们往往习惯只设计有限的几个表 实现某类功能的数据全部塞在一个表中 各表之间几乎毫无关联 网上不少的免费管理软件都是这样的东西 当程序功能有限 数据量不多的时候 其程序运行起来没有什么问题 但是如果用其管理比较重要的数据 风险性非常大     2 系统学习过数据结构 但是还没有开发过对程序效率要求比较高的管理软件的程序员 这类人多半刚从学校毕业不久 他们在设计数据库表结构时 严格按照教科书上的规定 死扣e r图和 nf(别灰心 所有的数据库设计高手都是从这一步开始的) 他们的作品 对于一般的access型轻量级的管理软件 已经够用 但是一旦该系统需要添加新功能 原有的数据库表差不多得进行大换血     3 第二类程序员 在经历过数次程序效率的提升 以及功能升级的折腾后 终于升级成为数据库设计的老鸟 第一类程序员眼中的高人 这类程序员可以胜任二十个表以上的中型商业数据管理系统的开发工作 他们知道该在什么样的情况下保留一定的冗余数据来提高程序效率 而且其设计的数据库可拓展性较好 当用户需要添加新功能时 原有数据库表只需做少量修改即可     4 在经历过上十个类似数据库管理软件的重复设计后 第三类程序员中坚持下来没有转行 而是希望从中找出 偷懒 窍门的有心人会慢慢觉悟 从而完成量变到质变的转换 他们所设计的数据库表结构有一定的远见 能够预测到未来功能升级所需要的数据 从而预先留下伏笔 这类程序员目前大多晋级成数据挖掘方面的高级软件开发人员     5 第三类程序员或第四类程序员 在对现有的各家数据库管理系统的原理和开发都有一定的钻研后 要么在其基础上进行二次开发 要么自行开发一套有自主版权的通用数据库管理系统     我个人正处于第三类的末期 所以下面所列出的一些设计技巧只适合第二类和部分第三类数据库设计人员 同时 由于我很少碰到有兴趣在这方面深钻下去的同行 所以文中难免出现错误和遗漏 在此先行声明 欢迎大家指正 不要藏私哦 )     一 树型关系的数据表    不少程序员在进行数据库设计的时候都遇到过树型关系的数据 例如常见的类别表 即一个大类 下面有若干个子类 某些子类又有子类这样的情况 当类别不确定 用户希望可以在任意类别下添加新的子类 或者删除某个类别和其下的所有子类 而且预计以后其数量会逐步增长 此时我们就会考虑用一个数据表来保存这些数据 按照教科书上的教导 第二类程序员大概会设计出类似这样的数据表结构     类别表_ (type_table_ )    名称          类型约束条件  说明    type_id    int     无重复     类别标识 主键    type_name char( )   不允许为空   类型名称 不允许重复    type_father  int    不允许为空   该类别的父类别标识 如果是顶节点的话设定为某个唯一值    这样的设计短小精悍 完全满足 nf 而且可以满足用户的所有要求 是不是这样就行呢?答案是no!why?    我们来估计一下用户希望如何罗列出这个表的数据的 对用户而言 他当然期望按他所设定的层次关系一次罗列出所有的类别 例如这样     总类别    类别     类别     类别     类别     类别     类别     类别     类别     类别     ……    看看为了实现这样的列表显示(树的先序遍历) 要对上面的表进行多少次检索?注意 尽管类别 可能是在类别 之后添加的记录 答案仍然是n 次 这样的效率对于少量的数据没什么影响 但是日后类型扩充到数十条甚至上百条记录后 单单列一次类型就要检索数十次该表 整个程序的运行效率就不敢恭维了 或许第二类程序员会说 那我再建一个临时数组或临时表 专门保存类型表的先序遍历结果 这样只在第一次运行时检索数十次 再次罗列所有的类型关系时就直接读那个临时数组或临时表就行了 其实 用不着再去分配一块新的内存来保存这些数据 只要对数据表进行一定的扩充 再对添加类型的数量进行一下约束就行了 要完成上面的列表只需一次检索就行了 下面是扩充后的数据表结构     类别表_ (type_table_ )    名称          类型约束条件         说明    type_id    int    无重复           类别标识 主键    type_name char( )   不允许为空         类型名称 不允许重复    type_father  int    不允许为空         该类别的父类别标识 如果是顶节点的话设定为某个唯一值    type_layer  char( )  限定 层 初始值为    类别的先序遍历 主要为减少检索数据库的次数    按照这样的表结构 我们来看看上面例子记录在表中的数据是怎样的     type_id   type_name    type_father    type_layer           总类别                           类别                            类别                           类别                           类别                            类别                           类别                            类别                           类别                           类别                   ……    现在按type_layer的大小来检索一下 select * from type_table_ order by type_layer    列出记录集如下     type_id   type_name    type_father    type_layer           总类别                          类别                            类别                           类别                          类别                           类别                            类别                           类别                            类别                           类别                    ……    现在列出的记录顺序正好是先序遍历的结果 在控制显示类别的层次时 只要对type_layer字段中的数值进行判断 每 位一组 如大于 则向右移 个空格 当然 我这个例子中设定的限制条件是最多 层 每层最多可设 个子类别 只要按用户的需求情况修改一下type_layer的长度和位数 即可更改限制层数和子类别数 其实 上面的设计不单单只在类别表中用到 网上某些可按树型列表显示的论坛程序大多采用类似的设计     或许有人认为 type_table_ 中的type_father字段是冗余数据 可以除去 如果这样 在插入 删除某个类别的时候 就得对 type_layer 的内容进行比较繁琐的判定 所以我并没有消去type_father字段 这也正符合数据库设计中适当保留冗余数据的来降低程序复杂度的原则 后面我会举一个故意增加数据冗余的案例      二 商品信息表的设计    假设你是一家百货公司电脑部的开发人员 某天老板要求你为公司开发一套网上电子商务平台 该百货公司有数千种商品出售 不过目前仅打算先在网上销售数十种方便运输的商品 当然 以后可能会陆续在该电子商务平台上增加新的商品出售 现在开始进行该平台数据库的商品信息表的设计 每种出售的商品都 cha138/Article/program/Oracle/201311/17002

相关参考

知识大全 动态数据仓库设计与应用浅谈

  数据仓库技术的每次演进都以发掘企业数据中更多价值作为目标而近期流行的动态数据仓库技术不仅在灵活性可视化方面有了长足进步还能够对企业决策合作伙伴及客户服务提供更为强大的支持  数据仓库发展历程  数

知识大全 快速掌握数据库设计范式的基本概念

  由于数据库设计中所遵循的范式规则比较复杂对于初学者来讲很难完全记住本文针对数据库设计范式的基本概念进行了扼要的总结  第一范式:  对于表中的每一行必须且仅仅有唯一的行值在一行中的每一列仅有唯一的

水处理设计浅谈:什么是好设计篇?

一、行业技术概况水处理是应用性的学科,行业技术也有着其自身的特点。1、技术门槛普遍偏低水处理工程的建设结果基本都比较直观和易于理解,技术模仿和进入门槛普遍较低,模仿起来不需要有太多的专业功底,多花些心

水处理设计浅谈:什么是好设计篇?

一、行业技术概况水处理是应用性的学科,行业技术也有着其自身的特点。1、技术门槛普遍偏低水处理工程的建设结果基本都比较直观和易于理解,技术模仿和进入门槛普遍较低,模仿起来不需要有太多的专业功底,多花些心

水处理设计浅谈:什么是好设计篇?

一、行业技术概况水处理是应用性的学科,行业技术也有着其自身的特点。1、技术门槛普遍偏低水处理工程的建设结果基本都比较直观和易于理解,技术模仿和进入门槛普遍较低,模仿起来不需要有太多的专业功底,多花些心

知识大全 数据库设计中的反规范技术探讨

   数据库设计简述    数据库设计是把现实世界的商业模型与需求转换成数据库的模型的过程它是建立数据库应用系统的核心问题设计的关键是如何使设计的数据库能合理地存储用户的数据方便用户进行数据处理   

知识大全 Java数据库程序中的存储过程设计

Java数据库程序中的存储过程设计  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文阐述了怎么

知识大全 设计模

  近段要实现一个上传excel文件到服务器并把excel文件的数据导入到数据库表中的功能   excel文件有两种格式对应数据库两张表我先实现了其中一种excel格式式

知识大全 java数据库设计中的14个技巧

  下述十四个技巧是许多人在大量的数据库分析与设计实践中逐步总结出来的对于这些经验的运用读者不能生帮硬套死记硬背而要消化理解实事求是灵活掌握并逐步做到在应用中发展在发展中应用原始单据与实体之间的关系 

浅谈骨折治疗中的动静结合

骨折治疗方法中,把整复、固定、练功视为治疗骨折的基本法则。著名的骨伤科专家尚天裕在《中西医结合治疗骨折》一书中,首先提出了“动静结合”这一概念,即骨折固定(静)和早期活动练功(动)结合起来,同时治疗骨