最近做了一个小项目完整的数据库设计,想总结一些设计上的所得,希望大家多多指教。

有时一个项目,普通程序员一般不会去接触数据库设计,一般都有专业的DBA或是老程序员去设计,下面是我推测的几点可能原因:
      1:新手对项目了解不深,正好这是老鸟的长处。
      2:新手对局部的关注往往大于整体,很难考虑的特别周全。
      3:数据库设计的好坏在某种程度上直接影响项目的复杂度以及性能。

第一:我们要知道什么是范式,为什么说到数据库设计总要提到一个名词:范式。范式:符合某一种级别的关系模式的集合。设计数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式。

第二:范式的分类。关系数据库中的关系必须满足一定的要求,目前关系数据库有六种范式:第一范式、第二范式、第三范式、第四范式、第五范式和第六范式。满足最低要求的是第一范式,其余范式以次类推。这么多的分类并不一定要求全部满足,平时我们通常是达到第三范式就行。
       第三:范式的作用?
        1:优点:是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。
        2:缺点:可能使数据库产生重复数据,从而导致创建多余的表。
        3:是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。
        4:设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,也不会发生插入、删除和更新操作异常。反之则给编程人员制造麻烦,可能存储了大量不需要的冗余信息。

下面来简单介绍下前三种范式:
       一:第一范式。是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库。 所谓第一范是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。 例如有一张存储文件的表,正确应该是这样:可以看到这个表包含了好几个列,如果我们把这些信息都放在一列里面那么就不满足上面定义的1NF了。

create table Regulations (
   ID                   int                  identity,
   Title                nvarchar(200)        null,
   FileAddress          varchar(255)         null,
   OpenDate             datetime             null,
   TypeID               int                  null,
   PostDate             datetime             null,
   constraint PK_REGULATIONS primary key (ID)
)

二:第二范式:在第一范式的基础上建立起来的。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。像上面的Regulations的ID列就是一个身份标识列(identity)。

三:第三范式:要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如:上面有了一个文件表 Regulations,如果这个表是存储的主文件,它相应的还有n个附件信息的话,我们就需要创建另外一张附件表来存储附件。两表如何联系起来呢,我们可以把主文件表的主键随同附件信息做为一条记录插入到附件表中,这里插入的主文件表信息中只包含了主键ID,并没有插入其它信息,这种关系就满足了第三范式要求。

create table Attachment (
   ID                   int                  identity,
   FileID               int                  null,//主文件主键ID
   Address              varchar(255)         null,
   Title                nvarchar(200)        null,
   constraint PK_ATTACHMENT primary key (ID)
)

最后来总结了我这个项目中的具体应用:


第一:启用数据字典理念来提高开发效率。什么是数据字典这里我不多说,大家不知道的可以网上搜索下。在一个项目中有时会遇到非常多的选项,就是供表单选择某些小数据项的内容,请看下面的图:

每一个模块在插入记录时都或多或少有这样的选项,如果每一张表都建一个对应的选项表的话,维护进来工作量相当大,所有可以把这些小数据量的选项存储到一张表,数据字典表如下:

下面是数据字典的数据展示图:

第二:对数据库表字段数据类型的设置有了进一步认识。

         1:SQL有一种特殊的数据类型;Unicode 数据类型,包括 Nchar,Nvarchar 和Ntext 传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型,所占用的空间是使用非 Unicode 数据类型的两倍。当列的长度变化时,应该使用Nvarchar 字符类型。当列的长度固定不变时,应该使用 Nchar 字符类型。我们在表单验证时,用户有时会输入英文和中文混合文字,为了验证方便,可以将这种情况时的字段设置成Unicode 。

2:对于非Unicode 数据,尽量选择相对应的类型,例如手机号码一般都是数字组成,且长度基本固定,设置成char(15)就行,email设置成varchar(100)就行。

第三:如何灵活利用一对多关系。一对多的关系非常常见,但如果加以灵活应用有时效果更佳。
          例如,上面的图中有一个了解管道的选项,它和对应的主表是一对多的关系,如果这个选项在不同的模块中出现,我们是否需要为每个主表建立一个一对多关系呢?我选择做一个中间关系表。我们可以把所有模块中包含了了解管道选项的主表与这个中间关系表联系起来,这样就只用维护这一个关系表就行了,节约不少时间。

项目小结之数据库设计相关推荐

  1. 项目开发周期与数据库设计对比

    项目开发周期与数据库设计对比 项目开发周期 数据库设计 需求分析 分析客户的业务和数据处理需求. 1.         收集信息(不怕多,但怕漏): 2.         标识对象: 3.       ...

  2. 团队作业第五次—项目系统设计与数据库设计

    作业描述 所属课程 软件工程1916|W(福州大学) 作业要求 团队作业第五次-项目系统设计与数据库设计 团队名称 待就业六人组 作业目标 宏观的对系统的整体结构设计,并在此基础上,进行数据库设计 系 ...

  3. 项目系统设计与数据库设计(那周余嘉熊掌将得队)

    作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:团队作业第五次-项目系统设计与数据库设计 团队名称: 那周余嘉熊掌将得队 作业目标:进行数据库设计和系统设计,完善类图,绘制评审表 团队 ...

  4. 谈谈实际项目中对 数据库设计 的一些思考

    注:本人开发经验尚浅,下文主要谈的是自己的一些想法,不足之处请指出. 最近半年时间都花在管理系统的开放上面,对数据库的设计有一些自己的想法,在我看来数据库设计的key point就是妥协.一个设计的比 ...

  5. 浅析实际项目中对数据库设计的一些思考

    从数据库管理系统的开放层面来讲,数据库设计的key point就是妥协.一个设计的比较好的数据库都是在业务逻辑.设计规约和便于开发这三者之前来回考量,从而获得3-win的结果.下面主要是在思考和总结的 ...

  6. Peekaboo——项目系统设计与数据库设计

    这个作业属于哪个课程 软件工程实践2022年春-F班 这个作业要求在哪里 团队作业三-概要设计与数据库设计 这个作业的目标 继续完善设计类图,设计好系统和数据库.制定好计划和分工: 其他参考文献 cs ...

  7. 在线 OJ 项目(二) · 操作数据库 · 设计前后端交互的 API · 实现在线编译运行功能

    一.操作数据库前的准备 二.封装操作数据库数据的相关操作 三.设计前后端交互的 API 四.实现在线编译运行功能 一.操作数据库前的准备 设计数据库表 我们需要对数据库中存储的题目进行操作. 创建一个 ...

  8. 一个电商项目的数据库设计实践(第一部分)(附源码)

    一次电商项目后台的数据库设计小结(第一部分)(附源码) 1.准备工作 2.用户实体 2.1 用户登陆表(customer_login) 2.2 用户信息表(customer_inf) 2.3 用户级别 ...

  9. 软件工程电商系统数据库定义_某个电子商务系统项目的数据库设计

    杨教授工作室,版权所有,盗版必究, 1/13 页 1 1.1 EbookStore/EBank 项目的数据源设计 1.1.1 本项目中的数据库设计概述 1 .数据库设计 ( 1 )数据库设计方法 一般 ...

最新文章

  1. Ubuntu系统添加root用户
  2. 微软服务器无法删除不了,微软终于决定解决 “进程占用而无法删除某文件”的问题...
  3. 兰州谋定百合品牌-农业大健康·万祥军:功能性农业产业脱贫
  4. [Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value
  5. linux 64位 寻址空间_Ubuntu 20.04(64位)如何配置gcc-3.4用于编译linux-0.11
  6. VxWorks动态加载.out文件
  7. 2022 MathorCup 数学建模B题思路解析
  8. 落户上海!分享心得,再做个积分计算器
  9. CashFiesta注册网赚
  10. 计算机专业文献阅读报告,文献阅读报告范本.doc
  11. 接口是什么?什么是接口?
  12. 美图大咖-电商图片处理软件
  13. 2020计算机视觉会议地点,2020年计算机视觉与信息技术国际会议(CVIT 2020)
  14. FFMPEG Qt录屏软件开发之视频采集
  15. 如何将英文文献转中文?
  16. Eclipse常见问题和解决方案for noob
  17. 互联网运营是青春饭吗?老运营告诉你答案
  18. 安卓支持App内文字翻译
  19. 东南大学计算机考研学硕,东南大学学硕考研经验
  20. 【开源访谈】腾讯贺嘉:从小程序谈起,开发者该如何跟进新技术?

热门文章

  1. Linux下安装Anaconda 详细过程 搭建python环境
  2. netstat和lsof端口结果不一致
  3. 用electron-forge创建一个项目
  4. 阿里巴巴400集python教程_阿里巴巴推荐的400集Python视频合集免费学起来,学完万物皆可爬...
  5. 数据结构实验之栈与队列一:进制转换
  6. Requires: libstdc++.so.6(GLIBCXX_3.4.15)
  7. AtomicInteger源码分析——基于CAS的乐观锁实现
  8. 你不知道的JavaScript错误和调用栈常识
  9. Spring的AOP原理
  10. 3.6 Git 分支 - 分支的衍合