项目小结之数据库设计

简介:

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


      有时一个项目,普通程序员一般不会去接触数据库设计,一般都有专业的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)就行。

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

 

 

分类:  ASP.NET
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2013/03/21/2973370.html ,如需转载请自行联系原作者
相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
相关文章
|
3月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
5天前
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
15 4
|
3月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
3月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
119 11
|
4月前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
4月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
3月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
469 10
|
3月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
339 6
|
3月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
99 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
4月前
|
Java 数据库连接 数据库
数据库以及其他项目配置
该项目配置了数据库连接和MyBatis设置,并解决了配置文件加载问题。启动类使用 `@SpringBootApplication` 注解,可通过 `@ComponentScan` 指定扫描包。Lombok 自动生成 getter/setter 等方法,简化代码。Result 实体类用于统一返回格式。用户模块包括注册与登录功能,使用 MD5 加密密码、Spring Validation 参数校验及 JWT 认证。JWT 工具类处理令牌生成与解析,并通过拦截器验证。Redis 优化登录功能,利用 ThreadLocal 存储用户信息。此外,还包括文章模块的相关功能,如文章分类管理、
46 2