数据库的设计与维护

  前言

数据库是软件数据的核心部分,也可以说是软件的心脏部分,好的数据库设计会让软件具有较高的扩展性,以及很好的性能,差的数据库设计会大大缩短软件的生命周期,甚至直接导致软件上线不久就死亡。下面我就以我现在的经验,说一说,如何去设计一个好的数据库。

  表命名和字段命名

表命名和字段命名要注意地方是:

一、命名不要使用中文,因为中文的编码是GB2312或者GBK,但现在主流的数据库,如MySql,Oracle,SqlServer默认编码都是UTF-8,如果为了途方便而使用中文,就避免不了要解决乱码问题。

二、命名不建议和系统函数或关键字重名,因为你写SQL语句的时候通常都不会加表示列名或者字段名的转义符号,而如果你的表命名或者字段命名与系统函数或关键字重名,就会出现SQL运行的错误,而你又要费时间去找,找完还要把转义符都加上,非常麻烦。

三、命名不要用拼音首字母,命名千万不要用拼音首字母,使用英文或者拼音全拼,因为这会使得别人很难读得懂你字段的意思,我曾经就看过一个数据库,里面字段全是这种简拼,非常难读懂,姓名就写XM,身份证号就写SFZH,学号就写XH,一个,两个,三个,那还受得了,整个数据库一百多个字段都这样,而且还不带重样的,基本就吐血了。

字段类型定义

字段类型定义需要注意的地方是:

一、字段长度尽量设置的比估计的长度稍微大一些,特别是在定义varchar字符串类型的时候,最好是估计长度的100%~120%,因为在实际开发过程中,一定会遇到需求不断变更,或者出乎意料之外的情况,如果你在此之前做过一些准备,那么即使出现意外了,你就能非常轻松的应对了。当然这种设置不能太大,比如像varchar这种,虽然是可变长度的字符串,但是如果设置太大,是会影响查询性能的。

二、合理使用固定长度字符串类型,固定长度字符串类型与可变长度字符串类型在查询方面具有较大优势,固定长度字符串类型做索引性能要比可变长度字符串类型来的高很多,具体是因为哈希值的特点,这个不深入讲了。

表结构设计

我着重说表结构的设计:

一、主键,每新建一张表都要有主键,主键就是一个标识字段,新建主键的时候通常会建立聚集索引,聚集索引能提高查询性能,另外主键的设置有利于让各种数据库框架认识哪些字段是作为标识字段使用的。

二、表关系,分为一对多关系,一对一关系和多对多关系:

1.一对多关系,一个对多个,例如一张订单里有多个产品,那么订单就是一个,产品就是多个,订单对产品就是一对多。

2.一对一关系,单个对单个,例如一张病床上只能有一个病人,这就是一对一关系,不过一对一关系更多的是用于做表扩展字段的,例如我有一个张用户表User(Id,Name,PassWord,Phone,Address,CreateTime,State...),现在我要添加微信用户,我就可以新建一张表WeiXinUser(OpenId,WeiXinUserName,UserId...),将UserId作为外键,这样的好处是能重用,提高了扩展性,如果要对接支付宝,也可以仿照这种模式,这种也类似与类里面的继承关系。当然你也可以在User表里直接加上这些字段,但这样一来就会出现数据冗余,如果用户,特别是不用微信,支付宝的那些用户(例如PC用户)只限于几百个,几千个,那问题不大,属于合理数据冗余范围,但如果用户数量是几万个,几十万个,甚至几百万个,数据冗余量就非常大了,会非常影响数据库性能。

3.多对多关系,多个对多个,例如权限和用户组,多个权限可以用在多个用户组,用户组里面可以包含多个权限,就是多对多,如权限表UserRole,主键Id,用户组表UserGroup,主键Id,要做多对多关系,就新建一张表UserRole_UserGroup_Mapping,里面只有两个字段,UserRoleId作为外键对应UserRole的主键Id,UserGroupId作为外键对应UserGroup的主键Id。

三、无法确定字段的处理,我们通常会遇到这种问题,我要记录每个产品的产品参数,但我们无法确定产品参数有哪些,那么这个时候我们先确定一些产品最基本的参数,如Name.ProductPictures,CreateTime等等,要记着一点,就是如果产品的参数存在查询需求的,最好列为基本参数;确定完基本参数后,再加两个字段,Type,ProductData。Type将用来确定ProductData存储结构,而ProductData是用来存储序列化数据的,比如我可以将产品参数数据封装入对象,接着用Json序列化存入ProductData字段中,那取的时候我可以根据Type字段的值,反序列化,将ProductData里的Json数据封装入对象,再使用。所以这样产品表的设计是Product(Id,Name.ProductPictures,CreateTime,Type,ProductData)。

  数据冗余

通常人认为数据冗余是不能存在的,会影响数据库性能,但其实如果对数据库性能影响不大,或者性能要求不高,它是可以存在的。比如权限,最常见的就是CMS权限,CMS权限有分为模型权限和栏目权限,模型权限是以模型的增、删、改为一个单元的,栏目权限是以栏目是否能访问为一个单元的,这两个是权限里面内容字段是都需要被查询的,那么我们会直接把模型权限和栏目权限放在一张表里,模型权限和栏目权限里面内容字段都是可空的,通过一个Type字段值去区分它。这个时候模型权限和栏目权限字段肯定有很多为空的,但因为权限的数据量本身不会很大,这些冗余量对数据库性能影响微乎其微,所以这样的数据冗余是合理的数据冗余。换言之,如果你不这么做,采用继承结构,那么在代码里,你不仅要多两个模型与之对应,还要做维护这两个表的一系列操作,大大的增加了工作量。

时间: 2024-11-03 03:24:40

数据库的设计与维护的相关文章

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限.本章将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼. 9.1 高效的模型设计 最规范的就一定

数据库schema设计与优化

原文地址 1. 前言 对于数据库而言,在日常开发中我们主要的关注点有两块,一个是schema的结构设计,另一个就是索引的优化,这两块是影响我们最终系统结构和性能的关键部分,自然也是我们花费精力最多的部分: 本文主要介绍数据库设计中的一般原则和优化手段,包括数据库的一半范式.反范式设计.数据切分.数据路由与合并等等 2. Schema设计的一般性原则 2.1 概述 范式理论是关系型数据库设计的黄金法则,它提供了数据结构化的理论基础,有效地保证了数据的一致性,应该说,关系型数据库就是在范式的基础上才

mysql web数据库的设计归范-2表设计原则

[职责分离原则] 职责分离原则是指在设计的时候应当考虑到数据的产生,聚合使用等原则,每个系统干自己能干的事情,每个系统只干自己的事情.一个数据表应该放在哪个系统中,通常取决于几点: 1. 谁产生这个信息:通常情况下谁产生了这个数据应当对此数据负责:也就是考虑该数据的创建,发展,销毁等全生命周期的定义,并将这个定义维护起来提供给消费者作为消费原则: 2. 谁最经常使用这个信息:如果某个系统最经常使用这个数据,最经常去修改某个数据,也应该由该系统来负责保存维护该数据: 3. 遵守高内聚,低耦合的考虑

数据库范式的思考以及数据库的设计

数据库范式--通俗易懂[转] 数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库.甚至设计出错误的数据库.而想要理解并掌握范式却并不是那 么容易.教科书中一般以关系代数的方法来解释数据库范式.这样做虽然能够十分准确的表达数据库范式,但比较抽象,不太直观,不便于理解,更难以记忆. 本文用较为直白的语言介绍范式,旨在便于理解和记忆,这样做可能会出现一些不精确的表述.但对于初学者应该是个不错的入门.我写下这些的目的主要是为了加强 记忆,其实我也比较菜,我希望当我

数据库 - 物理设计

数据库的物理设计 数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于选定的数据库管理系统 为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,就是数据库的物理设计 数据库物理设计的步骤 确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构 对物理结构进行评价,评价的重点是时间和空间效率 如果评价结果满足原设计要求,则可进入到物理实施阶段,否则,就需要重新设计或修改物理结构,有时甚至要返回逻辑设计阶段修改数据模型 数据库物理设计的内容和方法 设计物理数据库结构

Oracle数据库表设计时的注意事项

表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据库菜鸟到数据库专家这个过程中,在表设计与管理上,或多或少,会犯一些错误.笔者今天就谈谈自己在这方面的经验与教训,或许能够给大家一些警示作用. 表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据库菜鸟到数据库专家这个过程中,在表设计

关于论坛数据库的设计(分表分库等-转)

关于论坛数据库的设计 文章分类:数据库 一个简单的论坛系统 1:包含下列信息: 2:每天论坛访问量300万左右,更新帖子10万左右. 请给出数据库表结构设计,并结合范式简要说明设计思路. 一. 发帖主题和回复信息存放在一张表,并在这个表中增加user_name字段 对数据库的操作而言,检索数据的性能基本不会对数据造成很大的影响(精确查找的情况下),而对表与表之间的连接却会产生巨大的影响, 特别在有巨量数据的表之间:因此对问题的定位基本可以确定:在显示和检索数据时,尽量减少数据库的连接以及表与表之

数据库设计:用户登录系统数据库表设计

用户登录系统数据库表设计 最近看了看公司后台用户登录系统的设计, 比较混乱, 主要还是因为URS和Oauth以及URS第三方这三个登录形式各不相同导致的. 下面着重介绍一下涉及到第三方登录中需要注意的问题 在一个新项目中, 如果是要建立自己的登录体系的话, 那么直接创建一个Users表,包含username和password两列,这样,就可以实现登录了: id | username | password | name等其他字段 ----+----------+----------+-------

Java Web项目实战记录(数据库表设计)

又是忙到这个点 虽然累,但是看着自己的项目在一点一点的成长,心里满满的成就感>_< 今天上了一下午的cep(职场社交礼仪规划课程),是不是职场就像cep老师说的那么的勾心斗角呢? 所以今天并没有做了多少东西,数据库的文档已经出来了,但是不是太详细,表之间的关系并没有说的太清(数据库的设计我并没有参与) 以下是数据库的文档: --------------------------------------------------------------------------------------