发表于: 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_id
,order_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;
字段信息:
索引:
接下来修改代码:
- 【强制】SELECT语句必须指定具体字段名称,禁止写成
*
。因为select *
会将不该读的数据也从MySQL里读出来,造成网卡压力。且表字段一旦更新,但model层没有来得及更新的话,系统会报错。 - 【强制】insert语句指定具体字段名称,不要写成
insert into t1 values(…)
,道理同上。
这个部分的修改我还没想好,因为不全选的话就涉及到实体的设计,插入的时候也需要选择字段,增删改查代码都要重构。
明天的计划:
完成代码的修改。
遇到的问题:
1.原来的建表语句中插入时间戳的部分在 mysql5.5 上会报错,我进行了修改,也可以更换到 mysql 5.6。
2.运行 sql 文件报错但是不显示错误信息,在报错后随即输入 show warnings; 即可输出详细错误信息。
这里显示 text 类型的字段不能够设置默认值。
评论