Mysql的简介:
MySql是一个开源的关系型数据库管理系统,广泛应用于Web应用程序的数据存储和管理。它支持多用户并发访问,具有高性能、稳定可靠、易于使用和管理的特点。
MySql官网提供了详细的文档、下载、社区等资源,官网的地址为:MySQL
1、命名规范
数据库表名、字段名、索引名等等都遵循着命名的规范,命名的可读性要求要高,大家初学的时候都喜欢用拼音来起名,我们命名的时候尽量采用英文,采用驼峰命名或者下划线分割的方式,让人简知意。
反例:
表名:a,b,c
字段名:aa,bb,cc
正例:
表名:student,review,customers
字段名:student_id,review_name,customers_id
表名、字段名必须使用小写字母,禁止使用数字开头,不要使用拼音,不要使用英文的缩写
2、选择合适的字段类型
设计表的时候,需要选择合适的字段类型,比如说:
1、根据数据的类型选择字段类型:
整数型数据可以使用int或者bigint类型、浮点数据可以用float或者double类型、字符型数据可以使用varchar或者char类型
2、考虑数据的长度:
如果某个字段的数据长度不会超过10个字符,则可以使用char(10)类型来代替varchar(50)类型,以节省空间。如果存储的值太大,建议字段类型修改text,同时抽出单独一张表,然后再单独抽出一张表,并用主键相互连接。
3、注意精度和小数位数:
对于需要精确数值计算的字段(余额、百分比等等),应该选择带有精度和小数位数的字段类型(如decimal)
4、考虑数据完整性:字段类型也应该考虑到数据的完整性:
日期型数据应该使用date和datetime类型,以确保输入的日期格式正确。
3、主键设计要合理
主键的设计在数据库中非常重要,它用于唯一标识表中的每一行数据(也就是可以通过主键来确定行的位置),并且在数据的操作和查询中起到关键的作用。
通常主键的设计,不要与业务相关联,因为业务是会发生变化的,应当使用自增的id,并且保持主键的连续性。(正常使用的有:自增ID、UUID、或者是雪花ID)
4、选择合适的字段长度
问:数据库中的字段长度表示字符长度还是字节长度?
注:
1、字符长度就是字符串包含多少个字符,如String str = “hello”,字符有h,e,l,l,o一共5个字符,所以字符个数为5个。
2、字节长度是变量在内存中占有的空间大小,如int类型占4字节,long类型占8字节等等,并且1字节(byte)=8比特(bit)
需要注意的是:UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。但是,一个英文字母或者是一个中文汉字 都可以用一个字符的长度来装。
答:再mysql中,varchar和char类型表示字符的长度,而其他类型表示的是字节的长度。
char(10)表示字符的长度是10。bigint(4)表示显示长度是4个字节,但是因为bigint实际长度是8个字节,所以bigint(4)的实际长度就是8个字节。
所以再设计表时需要考虑一个字段的长度,比如一个用户名字字段(它的长度是5~20个字符),你觉得应该设置多长呢?可以考虑设置为varchar(32).需要注意字段的长度一般设置为2的n次方 如:8、16、32
5、优先考虑逻辑删除,而不是物理删除
什么是物理删除、什么是逻辑删除?
物理删除:把数据从硬盘中删除
逻辑删除:可以在你的表中单独添加一列名为is_deleted,用来标记该数据是否可以被前端使用。例如:我在前端注销一个账户,那么就对应将表中的该行数据中的is_deleted字段设置为0或者1,来表示该数据是否可用。
为什么推荐逻辑删除,不推荐物理删除:
数据的恢复困难、物理删除会导致索引数重构。
6、每个表都最好添加通用字段
id:主键,一个表必须得有主键,必须!!!
create_time:创建时间
creator:创建人
update_time:修改时间,必须,更新记录时,需要更新它
update_by:修改人,非必须
remark:数据的记录备注,非必须
7、控制表中的字段数量
建表的时候一张表的字段就不要过多了。尽量不要超过20个。超出的话要考虑如何拆分,也就是通常表——详情表
查询效率:当表中保存的数据量很大的时候,查询操作需要检索的数据也会随之增加。如果表的字段数量过多,查询的操作就需要读取更多的数据,这回导致查询的效率变慢。
数据库设计的复杂性:当表的字段过多的时候,数据库的设计和维护变得更加复杂。
8、MySQL 字段属性应该尽量设置为 NOT NULL
如果没有特殊的理由,一般建议将字段定义为not null
原因:
1、节省空间:当字段不需要存储任何东西时,“”是不占用空间的,但是null其实是占用空间的,null就是什么都没有,连\0都没有,\0在字符串中是结束符(因为mysql的底层是由C++实现的),但是在物理内存是占空间的,等于一个字节,而null就是连这一个字节都没有。
2、对null处理比较麻烦【不能用=null来查询数据,需要用is null 】:对null处理的时候只能用is null或者is not null,而不能采用+、in、<、>、!=、这些操作符号。比如:要查询:where name != “havename”,如果存在name为null的值的记录,那么查询的结果中就不会包含name为null值的记录。
如果将字段默认设置成一个空的字符串或者常量值并没有什么不同,且都不会影响到引用逻辑,那就可以将这个字段设置为not null。