发表于: 2020-04-29 23:25:46

1 1386


1.DB的设计和命名符号规范


搜索了一下数据库命名规范发现好像每个公司都有自己的约束规范,这里我找到一份文档看起来挺像回事的,就按照这个来了。

https://github.com/jly8866/archer/blob/master/src/docs/mysql_db_design_guide.md


【强制】创建数据库时必须显式指定字符集,并且字符集只能是utf8或者utf8mb4。创建数据库SQL举例:create database db1 default character set utf8;

【强制】创建表时必须显式指定字符集为utf8或utf8mb4。

【强制】建表必须有comment

【建议】建表时关于主键:(1)强制要求主键为id,类型为int或bigint,且为auto_increment(2)标识表里每一行主体的字段不要设为主键,建议设为其他字段如user_idorder_id等,并建立unique key索引(可参考cdb.teacher表设计)。因为如果设为主键且主键值为随机插入,则会导致innodb内部page分裂和大量随机I/O,性能下降。

【建议】核心表(如用户表,金钱相关的表)必须有行数据的创建时间字段create_time和最后更新时间字段update_time,便于查问题。

【建议】表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值。因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题。


文中给出了一个建议的建表 SQL,我照着修改了一下:


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for registery_info
-- ----------------------------
DROP TABLE IF EXISTS `registery_info`;
CREATE TABLE `registery_info` (
`id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
`student_id` bigint(20) NOT NULL COMMENT '学号',
`student_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
`qq_num` bigint(20) NOT NULL COMMENT 'QQ',
`major_subject` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学习方向',
`graduated_school` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '毕业院校',
`daily_report` tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '日报链接',
`slogan` tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '目标',
`brother` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '师兄姓名',
`come_from` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '户籍所在地',
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT NOW() ON UPDATE NOW() COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uniq_student_id` (`student_id`),
KEY `idx_student_name`(`student_name`)
) ENGINE = InnoDB AUTO_INCREMENT = 30000001 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;



字段信息:

索引:


接下来修改代码:

  1. 【强制】SELECT语句必须指定具体字段名称,禁止写成*。因为select *会将不该读的数据也从MySQL里读出来,造成网卡压力。且表字段一旦更新,但model层没有来得及更新的话,系统会报错。
  2. 【强制】insert语句指定具体字段名称,不要写成insert into t1 values(…),道理同上。

这个部分的修改我还没想好,因为不全选的话就涉及到实体的设计,插入的时候也需要选择字段,增删改查代码都要重构。



明天的计划:

完成代码的修改。



遇到的问题:

1.原来的建表语句中插入时间戳的部分在 mysql5.5 上会报错,我进行了修改,也可以更换到 mysql 5.6。

2.运行 sql 文件报错但是不显示错误信息,在报错后随即输入 show warnings; 即可输出详细错误信息。

      这里显示 text 类型的字段不能够设置默认值。



返回列表 返回列表
评论

    分享到