软件开发之数据库优化设计(一)
小白浏览:4562022-09-10 14:53:31本文累计收益:0我也要赚钱
一、数据库设计步骤

1、需求分析

2、概要设计阶段 E-R图  表-属性-关系图

3、详细设计

推荐一款数据库设计工具:PowerDesigner。

二、关系型数据库

一对一:不多见,经常写到一张表了;城市—政府;

一对多:公司-员工;学校-班级;外键,主从表

多对多:用户-菜单;学生-课程,一般用中间表Mapping(标准写法)

三、三大范式

1、每一列保持原始性,不可分割。

例如:地址一般分成省、市、区、街道四级

2、每一列都得跟主键相关,一张表只应该描述一个对象。

一个公司多个人,公司信息跟个人信息一个表格

3、每一列都得跟主键直接相关,而不是间接相关

用户表:公司Id、公司名称(不直接相关)

冗余,适度冗余可以接受,根据实际情况来。

设计决定开发量,一将不行,累死三军。

四、基础内容

命名风格:

表名格式:模块名称+表名,大写字母的模块缩写,不要下划线(避免映射),英文单词,首字母大写。拼音/汉字完全反对。

主键:

自增Id,数据库自动增加,int/bigint,sqlserver默认聚集索引,空间小,可以有业务意义(比如大于1000w都是新用户)

GUID,程序生成的,全球唯一,插入数据库,不会错误的join,无限的,方便导入,空间大,没有自身含义,没有聚集索引(创建时间来聚集)

外键:保证数据的完整性,类关系比较清楚。

外键做数据校验,级联删除

严格的数据关系的时候,使用外键

导入很麻烦,增删改数据的时候多一步操作,更多的是通过程序来完成,虚拟外键(程序保障)

合理使用:尽量少的使用外键;大型互联网项目瓶颈一般都在数据库,尽量少的让数据库做事。如果数据严谨性要求很高,可以用外键,其他的就不怎么用了,尤其是互联网项目。

数据库事务:

多条SQL作为一个整体提交给数据库,要么全部执行完成,要么全部取消。是一个不可分割的逻辑单元。

事务的特点:

原子性:要么都成功,要么都失败。

一致性:事务执行完,数据都是正确的。

隔离性:如果有两个事务同时操作一条数据,B事务要么在A事务执行前执行,要么A事务执行完成后在执行。(锁表)

持久性:数据提交后就固化下来。

如何避免死锁?

高并发的系统,死锁其实是不可避免的,尽量减少。

1、按照固定顺序操作数据,可以避免死锁。

2、事务尽量简短;不要在事务期间做等待操作;降低并发;事务里面耗时要短;锁的隔离级别。

存储过程:

存储过程Procedure是一组为了完成特定功能的SQL语句集合,在编译后存储在数据库中,用户通过制定存储过程的名称并给出参数来执行。

以前存储过程流行,跟技术体系有关,流量低并发少,业务比较复杂,更多的让数据库完成就行。

存储过程不好维护,逻辑分散了,不好管理,全部数据库操作

少用,大量复杂的逻辑、计算、数据传输,可以用,否则还是程序完成。

触发器:

触发器是一种特性类型的存储过程,触发器主要是通过事件进行触发自动调用执行的,一般不推荐使用。

游标:

游标实际上是一种能从多条数据记录的结果集中每次提取一条记录的机制,通常用在存储过程中,几乎不用。

视图:

试图就是一个虚拟的数据表,该表中的数据记录是由一条查询语句的查询结果得到的,有需要就用。

函数:

不推进使用自己定义函数,因为计算交给数据库,没法使用索引。

字段可空:

数值类型的不要可空,in查询,not in查询会没有结果,一般给个默认值。

通用字段:

除映射表之外,其他表都包含以下字段:创建时间、创建人、最后更新时间、最后更新人、State(0是删除、1是正常数据)、IsEnable

软删除:假删除、逻辑删除、把状态改成删除,而不是物理删除。

 

评论列表
发表评论
+ 关注