PartA:数据库心得

在本次的项目中,我们组选择的是一个偏算法类的项目,虽然对于数据库的需求没有其他组那么复杂,但我们的设计根据工厂的实际需要来构建,对于我们来说是一次尝试与创新的过程,也可以说是一个挑战的过程,学习了数据库这么久了,我们还是缺乏经验,现在我们利用我们所学到的知识来进行自己项目的数据库设计,这本身就是一个知识转化为生产力的过程。

在具体的设计与实施中,我们看到并感受到了一个管理系统从无到有的过程,对具体的设计步骤、思路、方法、技巧都有了进一步的了解,并感受深刻。这次课程设计加深了我们对数据库系统设计相关知识以及MySQL相关功能的理解。比如在建立基本的表、视图、索引、存储过程、触发器等,都比以前更加熟悉了,并在解决各种问题的过程中学到了很多新的知识。

在设计中我们基本能按照规范的方法和步骤进行,首先对现有的系统进行调查,并查阅有关资料,最后确定设计方案,然后设计并制作,实施过程中我们深刻的认识到认真执行管理系统软件标准的重要性,由于我们对管理系统软件相关的标准和规范不太了解,缺少行为操作准则,所以在设计中手法比较生硬,主与次也没能很好把握住,这些方面通过这次我们都要加强了解。

本次数据库的设计其实对我们来说是一次很好的锻炼,相当于把理论与实践进行结合,在课上的时候一直看老师在那里演示但是回去之后我们也没有实际进行训练,这次项目就是一个很好的机会让我们更加了解数据库的结构,为以后的设计打下基础,并对后续数据库的学习有一个很明显的提升。

 

PartB:数据库技巧总结

         首先对数据库的整体结构进行图形化的设计,然后在依据图形对数据库结构进行建立。简单来说,数据库设计就是根据业务系统的具体需要,结合我们所选用的DBMS(数据库管理系统),为这个业务系统构造出最优的数据存储模型,并建立好数据库中的表结构及表与表之间的关联关系的过程。使之能有效的对应用系统中的数据进行存储,并可以高效的对已经存储的数据进行访问。

应用系统中的数据可以有多种存储方式,可以把所有数据存储在一张表中,但是这样就不能达到高效访问的目的。那么我们为什么要进行数据库设计呢?好的设计: 减少数据多余,避免数据维护异常,节约存储空间,高效的访问。坏的设计: 存在大量数据多余,存在数据插入、更新、删除异常,浪费大量存储空间,访问数据低效。如果数据库已经在生产环境运行了一段时间之后,在想对数据库进行调整,就会影响业务的正常运行,所以在最初就要设计出简洁、高效的数据结构。

设计步骤:

1.需求分析: 数据是什么,数据有哪些属性,数据和属性各自的特点有哪些;

2.使用ER图 对数据库进行逻辑建模(跟我们所选的具体的数据库管理系统是没有关系的),大部分的表关系也是在这一步完成的

3.物理设计: 根据数据库自身的的特点把逻辑设计转换为物理设计;

4.维护优化: 新的需求进行建表,索引优化,大表拆分。随着应用程序上线的时间越来越久,需求越来越多,数据结构也会越来越复杂,所以在维护优化的时候也要遵循以上几步,完了之后再进行页面的操作,这样保证数据结构永远是最优的。

需求分析:

了解系统中所要存储的数据

了解数据的存储特点,比如有的有时效性,可以采用过期清理的方式存储,有的没有

了解数据的生命周期,可以采用分库分表的方式存储

小问题:

实体及实体之间的关系(1对1,1对多,多对多),可能是一个实体对应一个表,也可能是多个实体对应一个表

实体所包含的属性有什么

哪些属性或属性的组合可以唯一标识一个实体

逻辑设计:

1将需求转化为数据库的逻辑模型

2通过ER图的形式对逻辑模型进行展示

3同所选用的具体的DBMS无关

字段类型的选择原则:列的数据类型一方面影响数据存储空间的开销,另一方面也会影响数据查询性能。当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选用占用空间小的数据类型。

 

Char与Varchar的选择

如果列中要存储的数据长度差不多是一致的,则应该考虑用char,否则应考虑用Varchar

如果列中的最大数据长度小于50Byte,则一般也考虑用Char,当然,如果这个列很少用,则基于节省空间和减少IO的考虑,还是可以用Varchar

一般不宜定义大于50Byte的Char类型列

不同的字符类型它的字节长度是不一样的,如UTF-8,每个字符占3个字节。

 

Decimal和float的选择

decimal用于存储精确数据,而Float只能用于存储非精确数据。

由于Float的存储空间开销一般比Decimal小(精确到7位小数只需要4个字节,而精确到15位小数只需要8字节)。因此,精确数据只能选择Decimal类型,而非精确数据优先选择Float类型。

 

时间类型

使用Int存储时间字段的优缺点

优点:字段长度比datetime小

缺点:使用不方便,要进行函数转换

限制:只能存储到2038-1-19 11:14:07即2^32为2147483648

需要存储的时间粒度

年月日时分秒周

 

如何选择主键

区分业务主键和数据库主键

a) 业务主键用于表示业务数据,进行表与表之间的关联

b) 数据库主键为了优化数据存储(Innodb会生成6个字节的隐含主键)

根据数据库的类型,考虑主键是否要顺序增长

有些数据库是按主键的顺序逻辑存储的

主键的字段类型所占空间要尽可能的小

对于使用聚集索引方式存储的表,每个索引后都会附加主键信息

避免使用外键约束

外键是用于保持数据完整性的一种方式,但是在高并发的互联网中,如果我们使用外键,会带来负面影响,首先,对数据的导入操作,如果使用外键,每写一条数据都要查是否符合外键约束,是非常耗时的,尤其在高并发的时候。索引是为提高查询效率而建立的。1.降低数据导入的效率2增加维护成本3虽然不建议使用外键约束,但是相关联的列上一定要建立索引

 

避免使用触发器

我们经常会使用触发器来减少程序上的逻辑处理,比如在操作某张表的时候同时要记录日志,通常会使用触发器的方式向一张日志表中插入数据。对于MySQL来说,使用Innldb,虽然支持触发器,但是每一种触发器只支持一个,before/after……一共就需要6种触发器,如果建立触发器之后,在使用一些其他的工具,就会出现不能建立触发器的情况,给维护带来影响。如果大量使用触发器来保证业务逻辑,业务逻辑出现变更,其他人不知道的情况下,可能会影响业务规则。1.降低数据导入的效率2可能会出现意想不到的数据异常3使业务逻辑变得复杂。