表设计流程:
(1)分库:根据模块分
(2)分表:根据流程分表
(3)冗余字段和视图设计
21个表设计准则
(1)命名规范
account_no,account_number
表名用t_user,视图用v_i,字段名:表名_字段名
外键:表名_字段名$1
主键索引:pk_name,唯一索引:uk_name,一般索引:idx_name
(2)选择合适的字段类型
选小的类型:tinyint,smallint,int,bigint
小数,金额选择:decimal,不要使用float和double。
TABLE invoices (
invoice_id INT PRIMARY KEY,
amount DECIMAL(10, 2)
);
在上述示例中,amount列可以存储最多10位数字,其中2位用于小数部分。
精确度和舍入:DECIMAL类型确保数据的精确度,不会导致浮点数的精度问题。任何插入或计算的结果都将按照指定的精度进行四舍五入。
存储的字符串长度相似,尽量使用char定长。
varchar不预先分配空间,长度不要超过5000,如果过大,建议修改类型为text,并且单独抽出一个表,用外键对应。
在一张表中,varchar指定了最大长度的和不能超过65535,超过使用text。
尽管分配了最大长度的内存,但VARCHAR列实际上只会占用实际存储的字符数加上一些额外的字节用于存储长度信息。这意味着如果您在
VARCHAR(50)列中存储了一个只有10个字符的字符串,它只会占用10个字符的存储空间,而不会占用50个字符的存储空间。
在MySQL和许多其他关系型数据库管理系统中,TEXT是一种用于存储长文本数据的数据类型。TEXT数据类型适用于存储大块文本,例如文章、评论、日志、文章内容等等。以下是关于TEXT数据类型的一些关键信息:
1.数据类型分类
:TEXT是一种文本数据类型,通常被分为不同的子类型,根据最大允许的文本长度,可以分为以下几种子类型:
- TINYTEXT
- TEXT
- MEDIUMTEXT
- LONGTEXT
2.存储方式
:TEXT列的数据以二进制形式存储,因此可以容纳各种字符,包括文本、二进制数据或格式化文本,如XML或JSON。
3.用途
:TEXT通常用于存储大段的自由文本,例如文章内容、博客帖子、评论等,以及需要较长文本描述的应用程序。
4.性能考虑
:由于TEXT列存储大量数据,因此在查询和检索大型TEXT列的数据时可能会对性能产生影响。在处理大文本数据时,您应该考虑合理的索引策略以提高查询性能。
5.示例
:以下是一个创建包含TEXT列的表的示例:
sqlCopy codeCREATE TABLE articles (
article_id INT PRIMARY KEY,
title VARCHAR(255),
content TEXT
);
在上述示例中,content列用于存储文章的内容,可以容纳大段文本。
总之,TEXT是一种用于存储长文本数据的数据类型,它适用于需要存储大块文本的情况,如文章、评论等。根据您的需求,可以选择不同子类型的TEXT,以满足文本长度的要求。
(3)要选择毫无意义而独立不重复的数字作为主键
比如Auto_increment或者UUID,雪花算法生成的主键。
(4)字段长度选择2的幂次
(5)核心业务不使用物理删除,而是使用逻辑删除
(6)给表添加通用字段
id(主键),create_time,modified_time/update_time,version(用于乐观锁,非必须),remark(备注,非必须),modified_by(修改人,非必须),creator(创建人,非必须)
(7)表中列太多会影响性能,不超过20个
(8)尽量使用not null
(9)考虑哪些列需要加索引
一个表单索引不超过5个,过多会降低写速度。
加在区分度高的列。
(10)三大范式的合理使用
第一范式:字段的原子性
第二范式:所有列都和主键直接相关
第三范式:字段没有冗余,不存在传递依赖。
我们可以通过违反第三范式,添加和主键不是直接相关的冗余数据,从而减少表的数量。
比如:手机,单价,数量,总金额,总金额能通过单价和数量算出来。
(11)不做外键关联,外键概念需要在应用层解决。
(12)使用innodb
(13)使用utf8字符集
(14)枚举需要注释清楚
(15)时间类型的选择:
date,2023-2-2
time,8:30:23
datetime:2023-2-2 8:30:23,和时区无关
timestamp:和时区有关
year:2012
优先选择datetime
(16)不建议使用存储过程和触发器
(17)将多对多表关系,修改为一对多
通过将两个表变为三个表,从而将多对多改为一对多。
比如:学生和课程。通过新建一个学生-课程表,外键关联学生id和课程id,从而实现一对多。
(18)提前考虑分库分表