数据库表的设计原则:
1.尽量减少数据的冗余
2.mysql中尽量不要存储json结构的字段,
3.为表的字段选择合适的数据类型。
4.尽量使用innodb引擎
5.同一个库中尽量使用相同的存储引擎
数据类型的设计原则
当一个列可以选择多种数据类型时,应该优先考虑数据类型,其次是日期类型或二进制类型,最后是字符类型。对于相同级别的数据类型,应该选择占用空间少的数据类型。
整数类型
类型 | 存储空间 | SIGNED(有符号) | UNSIGNED(无符号) |
---|---|---|---|
tinyint | 1字节 | -128~127 | 0-255 |
smallint | 2字节 | -32768~32767 | 0-65535 |
mediumint | 3字节 | -8388608~8388607 | 0-16777215 |
int | 4字节 | -2147483648~2147483647 | 0-4294967295 |
bigint | 8字节 |
实数类型
类型 | 存储空间 | 是否是精确类型 |
---|---|---|
FLOAT | 4 | 否 |
DOUBLE | 8 | 否 |
DECIMAL | 每4字节存9个数字,小数点占一个字节 | 是 |
存储财务相关的用decimal 其它的可以使用float和double;
MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。
要定义数据类型为DECIMAL的列,请使用以下语法:
column_name DECIMAL(P,D);
在上面的语法中:
P是表示有效数字数的精度。 P范围为1〜65。
D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。
字符类型
varchar特点:
1.varchar用于存储变长字符串,只占用必要的存储空间
2.列的最大长度小于255则只占用一个额外的字符存储记录的长度
3.列的最大长度大于255则占用两个额外的字符存储记录的长度
4.varchar的最大长度为65535
varchar的长度选择问题
1.使用最小符合需求的长度
2.varchar(5)和varchar(255)的性能是不同的。
varchar的适用场景
1.字符串的长度分布不均匀
2.字符串很少被更新
3.使用了多字节字符集存储字符串
char类型
1.char类型是定长的
2.char类型的最大宽度为255
3.字符串存储在char中,会删除字符串末尾的空格
适用场景
1.适合存储字段长度分布均匀的字段
2.适合存储较短字符串
3.适合存储经常更新的字符串
日期类型
datetime:
以YYYY-MM-DD HH:MM:SS[.fraction]格式存储日期的时间
datetime=YYYY-MM-DD HH:MM:SS
datetime(6)=YYYY-MM-DD HH:MM:SS.fraction
datetime类型与时区无关,占用8个字节的存储空间
时间范围1000-01-01 00:00:00 到9999-12-31 23:59:59
timestamp
存储的由格林尼治时间到当前时间的毫秒数
以YYYY-MM-DD HH:MM:SS.[fraction]的格式显示,占用4个字节
时间范围 1970-01-01到2038-01-19
timestamp类型的显示依赖于所指定的时区
在行的数据修改时可以自动修改timestamp列的值
date
只存储日期 如存储生日字段
date存储1000-01-01到9999-12-31之间的日期
date的优点
1占用的字节数比使用字符串、datetime、int存储要少,使用date类型只需要三个字节
2使用date类型还可以利用日期时间函数进行日期之间的计算
time
只存储时间
存储格式为HH:MM:SS
存储日期时间数据的注意事项
1.不要使用字符串类型来存储日期时间数据
日期占用的存储空间更少
系统有很多的日期处理函数可以使用
日期类型可以直接进行比较搜索
2.使用int存储日期时间不如使用timestamp类型