数据库系统设计心得_ok_fine_goodnight
引言
首先为什么要设计数据库:当数据库比较复杂(如数据量大,表较多,业务关系复杂)时,我们需要先设计数据库.
一个好的数据库设计能保证数据的完整性,提高储存性能,为开发人员提供便利.
由此,数据库在本次项目中起着承上启下的关键作用.不可不查也.
数据库设计应遵守命名规范
数据库设计不仅是给计算机看,也是给人看的.命名不规范会增加开发人员开发和运营的难度.例如本次设计表名都加上了t_的前缀.其他字段命名方法统一.
如t_stock表的命名
CREATE TABLE t_stock
(
id INT NOT NULL AUTO_INCREMENT COMMENT 'id',
good_id INT NOT NULL COMMENT '商品id',
attribute_value_id INT COMMENT '商品规格id',
change_num INT COMMENT '本日的数量(有正负)',
num INT COMMENT '总的库存量(是加上该单据发生后的即时库存余额)',
add_time DATETIME COMMENT '添加日期',
update_time DATETIME,
del_flag INT DEFAULT 0,
PRIMARY KEY (id),
INDEX good_id_index(good_id)
)ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT '库存表';
数据库设计应遵守第三范式
表内数据不能冗余,大量冗余数据可能导致数据异常;不设计冗余的表,增加数据库开发负担;遵守第三范式,不把数据放在一张表上.
但有时范式会与性能冲突.
此次设计中发现在规范化表格过程中我们会拆分出更多更精细的表格,但后端开发人员常常需要综合的数据,为此需要进行多表连接的操作,这样与将数据从一张表中读出相比性能相差很多.于是我们为了性能也在一些表的设计上进行折中操作.
比如我们数据库中只需要有销售量和进货量即可通过简单的计算得出库存量.但是库存量查询将会频繁的发生,于是我们使用SQL触发器来额外生成一个库存量表,直接保存不同时间段的库存量.
increaseStock_trigger触发器
CREATE TRIGGER increaseStock_trigger
AFTER INSERT ON t_instock
FOR EACH ROW BEGIN
DECLARE existflag INT DEFAULT 0;
DECLARE last_stock_num INT DEFAULT 0;
SELECT COUNT(*) INTO existflag FROM t_stock WHERE good_id=new.good_id AND attribute_value_id=new.attribute_value_id AND DATE(add_time)=DATE(new.add_time) LIMIT 0,1;
SELECT num INTO last_stock_num FROM t_stock WHERE good_id=new.good_id AND
attribute_value_id=new.attribute_value_id ORDER BY ABS(new.add_time-add_time) ASC LIMIT 0, 1;
IF(existflag=1)
THEN UPDATE t_stock SET change_num=change_num+new.num,add_time=new.add_time,num=num+new.num WHERE good_id=new.good_id AND attribute_value_id=new.attribute_value_id
AND DATE(add_time)=DATE(new.add_time);
ELSEIF(existflag=0)
THEN INSERT INTO t_stock(good_id,attribute_value_id,change_num,num,add_time) VALUES (new.good_id,new.attribute_value_id,new.num,last_stock_num+new.num,new.add_time);
END IF;
END//
酌情使用外键
外键有着数据参照完整性约束,可能会导致数据库性能下降.本次项目将会频繁读取数据库,并且数据库单表记录上万条,对性能极为敏感,故在非必要的地方都没有使用外键.
熟悉数据库知识才能有的放矢,收放自如
Mysql 语言博大精深,除了简单的增删改查以外,还有外键,联表查询,存储过程,触发器等等功能.
本次设计数据库,我们充分明白了什么叫学无止境,什么叫从实践中学习.假若不使用Mysql,不对数据库有着强烈的使用需求,恐怕再也不会重拾过去所学的Mysql知识.
而对知识的熟悉,也将帮助我们加深对项目的理解,持续推动后续开发.难怪古人总说:温故而知新,可以为师矣.
推荐图书