三范式
首先,设计数据库,要尽可能的满足三范式,遵循三范式开发会减少数据冗余、提升系统可扩展性和查询性能。
第一范式的目标是确保每列的原子性
如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)
如果一个关系满足1NF,并且除了主键以外的其他列,都依赖与该主键,则满足第二范式(2NF)
第二范式要求每个表只描述一件事情
如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)
其他规范
名称设置
表名、字段名必须使用小写字母或数字,禁止出现数字开头禁止两个下划线中间只出现数字。数据库字
段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、
字段名,都不允许出现任何大写字母,避免节外生枝。
正例:aliyun_admin,rdc_config,level3_name
反例:AliyunAdmin,rdcConfig,level_3_name
id类型设置为bigintunsigned
两者区别
1、bigint
默认是有符号,即取值范围是正负范围
比如:bigint(20),就是-1234567890123456789~+1234567890123456789
2、bigintunsigned
无符号,即取值范围就是正值范围
比如:bigint(20),就是+12345678901234567890
创建时间和修改时间
每个表都要有creat_time和update_time
在设计表时,creat_time的类型要选择datetime,默认值要选择CURRENT_TIMESTAMP,不勾选更具当前时间更新。update_time的类型要选择datetime,默认值要CURRENT_TIMESTAMP,要勾选更具当前时间更新。
为什么这样做?这样数据库会自动更新创建时间和修改时间这两个字段。
字段设非空+默认值
为什么数据库要设置默认值呢?因为我们希望在插入数据时,有意或无意间被忽略的字段能够交由MySQL按我们事先预想的方式处理,例如一些默认正常状态码、用户插入数据时候尚未设置的文本字
段,诸如此类。
假设student表里有一个字段score被设置为<非空><默认值>,插入一条数据记录时,score字段值为空<''>,那这时score的字段值为<''>还是<默认值>?
设置默认值的作用只有在忽略了字段时才会发挥作用。何为忽略了字段,就是在写SQL插入语句的时候,不写要忽略的字段的字段名,例如:有一个student表,有字段id,name,age,score。score设置了默认值99,插入一条语句,insert into student (name,age)values('tom',3),这时忽略了score字段(id字段设置了主键和自动增长),mysql数据库就会按照事先设置的默认值插入到数据库中。
所以以上问题的答案是<''>。
因为NULL跟''是完全不一样的,NULL表示未知,没有类型可言;而''是有类型的,表示一个空的字符
串。所以,在插入有默认值的字段时,插入值为''时,依然会插入到数据库中。
而实际上数据库中的<空>表示的是NULL。
例如,当mysl数据库执行insert intostudent(name,age,score)values('tom',3,null)时会报错:#1048 - Column'score'cannot be null。
varchar不要全都设置长度为255
短一些的字段,varchar长度设置为32
把所有较短的字符串列都设为 VARCHAR(255) 并不是最好的做法,还是要合理选取长度。尽管 InnoDB 是动态存储的,但别的数据库引擎不一定是如此,有的可能会使用固定长度的行,或者固定大小的内存表, 内存表即为 SQL 查询中产生的临时表,它通常会为 varchar 类型分配最大的空间,比如 utf-8 编码下,内存表可能要为 VARCHAR(255) 分配2+3×255 字节 (2 是因为存的是字节长度而不是字符长度),如果行数非常多,这也会带来性能问题。不管其中每一行存储的数据是长还是短。另外也注意到InnoDB 的单列索引每个结点的最大是 767 字节 (即2+3×255)。
varchar是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字
段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引率。