说起数据库设计,相信大家都明白怎么回事,但说起数据库设计的重要性,我想大家也只是停留在概念上而已,到底如何重要?怎么重要呢?今天就将我至今为止的理解向大家阐述下。

一个不良的数据库设计,必然会造成很多问题,轻则增减字段,重则系统无法运行。我先来说说数据库设计不合理的表现吧:

1. 与需求不符

因为这个原因造成的改动量往往是最大。如果进入编码阶段的话,很可能会直接让你崩溃掉。

2. 性能低下

含有大数据量的表之间的关联过多;没有合理的字段设计来用于查询而造成的SQL查询语句很复杂;对于大数据量的表没有采用有效的手段去处理;滥用视图等。

3. 数据完整性丧失

含有主外键关系的表之间关联字段的设计方式不合理,造成更新与删除操作后程序容易出错或不完善;使用了已经删除或丢失掉的数据。

4. 可扩展性性太差

表设计的与业务绑定的太紧密、单一,造成表的可拓展性、可修改性太差,无法新需求的要求。

5. 非必要数据冗余量太大

没用的垃圾数据存储过多,不仅占用资源,还影响查询效率。

6. 不利于计算或统计

缺少必要的联系性或统计性字段或用于计算统计的字段分散于多个表中,造成计算统计的步骤繁琐,甚至无法计算统计。

7. 没有详尽的数据记录信息

缺少必要的字段,造成无法跟踪数据变化、用户操作,也无法进行数据分析。

8. 表之间的耦合性太大

多张表之间关联的过于紧密,造成一张表发生变化而影响到其他表。

9. 字段设计考虑不周

字段长度过短或字段类型过于明确,造成可发挥、可拓展的空间太小。

大多数的程序员对于软件开发的出发点认识不是很明确,总是认为实现功能才是重要的,在简单了解完基本需求后就急忙进入编码阶段,对于数据库设计思考的比较少、比较简单,大多设计都只停留在表面上,这往往是要命的,会为系统留下很多隐患。要么是写代码开发过程中才发现问题,要么就是系统上线运转后没多久就出现问题,还有可能给后期维护增加了很多工作量。如果到了那个时候再想修改数据库设计或进行优化等同于推翻重来。

数据库是整个软件应用的根基,是软件设计的起点,它起着决定性的质变作用,因此我们必须对数据库设计高度重视起来,培养设计良好数据库的习惯,是一个优秀的软件设计师所必须具备的基本素质条件!

那么我们要做到什么程度才是对的呢?下面就说说数据库设计的原则

1.  数据库设计最起码要占用整个项目开发的40%以上的时间

数据库是需求的直观反应和表现,因此设计时必须要切实符合用户的需求,要多次与用户沟通交流来细化需求,将需求中的要求和每一次的变化都要一一体现在数据库的设计当中。如果需求不明确,就要分析不确定的因素,设计表时就要事先预留出可变通的字段,正所谓“有备无患”。

2.  数据库设计不仅仅停留于页面demo的表面

页面内容所需要的字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。

3.  数据库设计完成后,项目80%的设计开发在你脑海中就已经完成了

每个字段的设计都是有他必要的意义的,你在设计每一个字段的同时,就应该已经想清楚程序中如何去运用这些字段,多张表的联系在程序中是如何体现的。换句话说,你完成数据库设计后,程序中所有的实现思路和实现方式在你的脑海中就已经考虑过了。如果达不到这种程度,那当进入编码阶段后,才发现要运用的技术或实现的方式数据库无法支持,这时再改动数据库就会很麻烦,会造成一系列不可预测的问题。

4.  数据库设计时就要考虑到效率和优化问题

一开始就要分析哪些表会存储较多的数据量,对于数据量较大的表的设计往往是粗粒度的,也会冗余一些必要的字段,已达到尽量用最少的表、最弱的表关系去存储海量的数据。并且在设计表时,一般都会对主键建立聚集索引,含有大数据量的表更是要建立索引以提供查询性能。对于含有计算、数据交互、统计这类需求时,还要考虑是否有必要采用存储过程。

5.  添加必要的(冗余)字段

像“创建时间”、“修改时间”、“备注”、“操作用户IP”和一些用于其他需求(如统计)的字段等,在每张表中必须都要有,不是说只有系统中用到的数据才会存到数据库中,一些冗余字段是为了便于日后维护、分析、拓展而添加的,这点是非常重要的,比如黑客攻击,篡改了数据,我们便就可以根据修改时间和操作用户IP来查找定位。

6.  设计合理的表关联

若多张表之间的关系复杂,建议采用第三张映射表来关联维护两张表之间的关系,以降低表之间的直接耦合度。若多张表涉及到大数据量的问题,表结构尽量简单,关联也要尽可能避免。

7.  设计表时不加主外键等约束性关联,系统编码阶段完成后再添加约束性关联

这样做的目的是有利于团队并行开发,减少编码时所遇到的问题,表之间的关系靠程序来控制。编码完成后再加关联并进行测试。不过也有一些公司的做法是干脆就不加表关联。

8.  选择合适的主键生成策略

主键生成策略大致可分:int自增长类型(identity、sequence)、手动增长类型(建立单独一张表来维护)、手动维护类型(如userId)、字符串类型(uuid、guid)。int型的优点是使用简单、效率高,但多表之间数据合并时就很容易出现问题,手动增长类型和字符串类型能很好解决多表数据合并的问题,但同样也都有缺点:前者的缺点是增加了一次数据库访问来获取主键,并且又多维护一张主键表,增加了复杂度;而后者是非常占用存储空间,且表关联查询的效率低下,索引的效率也不高,跟int类型正好相反。

终上所述,我们可见数据库设计在整个软件开发的起到的举足轻重的作用,尤其是我说的设计原则的第一点,数据库与需求是相辅相成的,我经常把软件开发比作汽车制造。汽车制造会经过图纸设计,模型制作,样车制造,小批量试生产,最后是批量生产等步骤。整个过程环环相扣,后一过程是建立在前一过程正确的前提基础之上的。如果在图纸设计阶段发现了一个纰漏,我们可以重新进行图纸设计,如果到了样车制造阶段发现这个错误,那么我们就要把从图纸设计到样车制造的阶段重来,越到后面发现设计上的问题,所付出的代价越大,修改的难度也越大。

数据库设计难度其实要比单纯的技术实现的难很多,他充分体现了一个人的全局设计能力和掌控能力,所以在今后的项目中大家一定要着重培养这方面的能力,这里我将我的经验分享给了大家,希望能对大家有所帮助。

数据库设计的重要性和设计原则相关推荐

  1. 系统设计原则的重要性_设计原则的重要性及其对好的设计的影响

    系统设计原则的重要性 The principles of design are the most important part of any design process. Without these ...

  2. 14.sql server数据库设计的重要性(by-朝夕)

    Database 前言 数据库设计工具 为什么要用建模工具? 1.数据库设计的重要性 2.开发工具 3.数据库三大范式 4.设计工具 5.设计习惯 如何使用? 前言 数据库设计工具 PowerDesi ...

  3. 用户体验和交互设计的重要性

    用户体验和交互设计的重要性 用户体验(UE/UX--User Experience )的概念:是一种纯主观在用户使用产品过程中建立起来的感受 ,用户体验是围绕产品的一整套体验,包括跟其相关的设计.制作 ...

  4. ncbi查找目的基因序列_基于PrimerBank和NCBI数据库的引物查找与设计

    基于PrimerBank和NCBI数据库的引物查找与设计---生科三班xhs原创,请勿转载 一.引物数据库查找: 要设计一个mRNA的qPCR引物,首先应该先看看别人是否已经使用过,可以先在数据库Pr ...

  5. 数据库70多张表设计的一些思考…

    数据库70多张表设计的一些思考- 昨天在一次研讨会上,一同志说他为甘肃某高校做了一个建筑部门的管理网站用了足足70多张表,我一听一惊,随口来句,这哥们扯吧! 我认为学校的单个部门业务不论多么复杂,这么 ...

  6. 移动端UI界面设计之APP字体排版原则| 萧蕊冰

    今天介绍的是移动端UI界面设计的有关APP字体排版原则的内容.除了电脑端的网站UI设计,移动端的界面设计也是UI设计中的一个重要部分,毕竟我们每个人平时身上带着的肯定有手机.今天萧蕊冰就介绍一下关于移 ...

  7. 平面设计中字体设计的重要性是什么

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 平面设计中字体设计的重要性是什么?文字在平面设计中有着举足轻重的地位.文字的设计可以变化各异,根据不同的字体.字号. ...

  8. 浅谈系统架构设计-从架构设计原理、架构设计原则、架构设计方法展开

    我们工作中一直强调要做架构设计.系分,最近前端同学在追求前端质量提升的时候,也在进行架构设计.前端系分的推广,那到底什么是架构设计和系分?该怎么做架构设计和系分?本文尝试对架构设计进行全面的介绍和分享 ...

  9. 数据库:数据库设计(需求,设计,运行,维护)

    1,数据库设计概述 1.1,数据库设计的基本概念 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种 ...

最新文章

  1. 批量实现面向对象的实例
  2. mysql登录服务器报错_mysql登录服务器报错
  3. Android移动开发之【Android实战项目】DAY9-LineChart的使用
  4. java面向对象(类与对象,局部变量成员变量,基本类型和引用类型作为参数传递)...
  5. SAP 凭证冲销可以使用BAPI_ACC_DOCUMENT_REV_POST或者BDC录制FB08来做
  6. spring 学习 requestMapping
  7. python编写程序输出诗句_Python学习笔记(一)-- print语句
  8. SP2010开发和VS2010专家食谱--第一章节--列表和事件接收器(6)--使用列表事件接收器...
  9. mysql索引方式_MySQL数据库的索引方式
  10. udp helper 的使用
  11. ceph查看卷_基于CEPH后端存储搭建Harbor
  12. 如何使用c语言制作微信小程序,不懂代码如何制作微信小程序?微信小程序的步骤?...
  13. Ubuntu+CUDA+OpenCV+Caffee安装
  14. 【笔记】人工智能 一种现代方法 人工智能 一种现代方法 第5章 对抗搜索
  15. 无刷直流电机模糊PID控制
  16. wpa_supplicant 使用
  17. WPS如何在同一篇文档针对不同章节设置不同的页眉页脚
  18. [育强飞]自动刷屏器_育强飞_新浪博客
  19. GCD深入学习之GCD的初识
  20. #pragma comment 用法

热门文章

  1. AMBER“FATAL: Atom .R<SEP 552>.A<N 1> does not have a type.“
  2. 【阿里云】短信服务 无认证 测试版本 附带短信发送工具类
  3. 代谢组学助力研究“线粒体闪烁”,揭示细胞“返老还童”的新奥秘
  4. Sun Java System Message Queue - Packet acknowledge failed after failover
  5. iOS Core Animation 简明系列教程
  6. Abbexa 细菌基因组 DNA 试剂盒介绍
  7. GIS与虚拟仿真下直观、完整、立体地园区实景展示
  8. Java 实现抽奖的两种方式
  9. Android 视频 美颜SDK对比
  10. 宝塔面板网页访问不了