世界杯预选赛中国队赛程_世界杯多少年一次 - fybstd.com


避免踩坑!数据库建表的18个最佳实践- 前言

文章目录

避免踩坑!数据库建表的18个最佳实践- 前言思维导图基础信息名字字段类型字段长度字段个数

约束主键NOT NULL外键唯一索引

性能优化存储引擎索引排序规则

特殊字段时间字段金额字段json字段大字段

其他字符集冗余字段注释

嗨! 后端开发的小伙伴们

今天,我想和大家分享一些关于数据库建表的 小技巧 ,帮助你避免踩坑,提高效率!

为什么要学习数据库建表

数据库是系统中存储核心数据的关键组件 。后端开发人员经常需要创建和维护数据库表,以满足业务需求 。如果建表时不注意细节,后期维护成本会很高,甚至会踩坑 。

这篇文章将介绍 18 个数据库建表的最佳实践,帮助你

选择合适的数据类型 ️设计字段和索引设置表约束 ⛔优化表性能

这些技巧都是我在工作中总结出来的,非常有借鉴意义,希望对你有所帮助

✨ 文章亮点:

满满的干货,都是实践经验避免踩坑,少走弯路提升效率,快速开发通俗易懂,小白也能看

继续阅读,了解数据库建表的18个小技巧

思维导图

基础信息

名字

数据库表、字段和索引命名规范

见名知意 名字要言简意赅,见名知意,让人一看就知道是什么意思。 避免使用模糊、不明确的命名。 名字不宜过长,尽量控制在30个字符以内。

大小写 名字尽量都用小写字母,因为从视觉上,小写字母更容易让人读懂。 避免使用大写字母或混合大小写。

分隔符 多个单词间,建议用下划线_分隔。 避免使用空格、驼峰标识或其他特殊符号分隔。

表名 建议带上业务前缀,方便归类和区分。 例如:order_pay、product_spu等。

字段名称 建议使用统一的命名规则,方便理解和维护。 例如:status表示状态、create_time表示创建时间等。

索引名 主键:建议使用id或sys_no命名。 普通索引和联合索引:建议加ix_前缀。 唯一索引:建议加ux_前缀。

示例

# 表

-- 订单表

CREATE TABLE order_info (

id INT PRIMARY KEY AUTO_INCREMENT,

order_no VARCHAR(32) NOT NULL,

user_id INT NOT NULL,

order_amount DECIMAL(10,2) NOT NULL,

...

create_time DATETIME NOT NULL,

update_time DATETIME NOT NULL,

delete_status TINYINT(1) NOT NULL DEFAULT 0

);

-- 商品表

CREATE TABLE product_spu (

id INT PRIMARY KEY AUTO_INCREMENT,

product_name VARCHAR(128) NOT NULL,

product_code VARCHAR(32) UNIQUE,

...

create_time DATETIME NOT NULL,

update_time DATETIME NOT NULL,

delete_status TINYINT(1) NOT NULL DEFAULT 0

);

# 索引

-- 订单表索引

CREATE INDEX ix_order_no ON order_info (order_no);

CREATE INDEX ux_user_id ON order_info (user_id);

-- 商品表索引

CREATE UNIQUE INDEX ux_product_code ON product_spu (product_code);

总结

好的命名规范,可以提高数据库的可读性、维护性和易用性。建议大家在开发过程中,遵循上述规范,统一命名。

字段类型

数据库字段类型选择原则 在数据库设计中,选择合适的字段类型对数据库的性能、存储空间和维护效率都有着重要的影响。以下是一些选择字段类型的原则:

1. 尽可能选择占用存储空间小的字段类型

在满足正常业务需求的情况下,应从占用存储空间小的字段类型开始选择,逐步向上选择。例如:

如果字段只能存储1-10之间的数字,则可以选择tinyint类型,而不是int或bigint类型。 如果字符串字段的长度固定或差别不大,可以选择char类型,而不是varchar类型。

2. 根据数据特点选择合适的字段类型

如果是是否字段,可以选择bit类型。 如果是枚举字段,可以选择tinyint类型。 如果是主键字段,可以选择bigint类型。 如果是金额字段,可以选择decimal类型。 如果是时间字段,可以选择timestamp或datetime类型。

3. 考虑数据存储和查询的效率

在某些情况下,使用占用空间更大的字段类型可能会提高数据存储和查询的效率。例如,使用int类型存储1-10之间的数字,虽然只用1个字节就足够,但查询时需要进行类型转换,而使用tinyint类型则可以直接进行比较。 对于经常需要进行比较或排序的字段,建议使用固定长度的类型,如char或int类型。

4. 参考数据库的最佳实践

不同的数据库对字段类型的设计可能有所不同,建议参考数据库的最佳实践来选择合适的字段类型。例如,MySQL官方建议使用decimal类型存储金额字段,以避免精度损失。

总结

选择合适的字段类型需要综合考虑存储空间、性能、维护效率等因素,并结合具体的业务需求进行选择。遵循上述原则可以帮助您选择合适的字段类型,设计出高效、易用的数据库。

以下是一些额外的建议:

在设计表时,应充分考虑业务需求,避免出现冗余字段或字段类型选择不当的情况。 可以使用数据库建模工具来帮助您设计数据库表,并选择合适的字段类型。 在对数据库进行变更之前,应进行充分的测试,以避免影响正常业务。

字段长度

数据库字段长度的定义和注意事项

在数据库表设计中,字段长度的定义是必不可少的一环。它不仅影响着数据的存储空间,还影响着数据的存储和查询效率。

1. 字符串类型长度

在 MySQL 中,varchar 和 char 类型代表的是字符长度,而不是字节长度。 varchar(n) 表示该字段最多可以存储 n 个字符。 char(n) 表示该字段必须存储 n 个字符,不足 n 个字符时,会用空格填充。

2. 数值类型长度

除了 varchar 和 char 类型之外,MySQL 中其他类型都是以字节为单位定义长度的。 例如:int(n) 表示该字段可以存储 n 个字节的整数。 bigint(n) 表示该字段可以存储 n 个字节的大整数。

3. 特殊情况

bigint(n) 中的 n 并非指实际存储长度,而是指显示长度。 当字段值小于 n 时,会用 0 填充前面不足的位数(前提是该字段设置了 zerofill 属性)。 当字段值大于 n 时,则会按照实际长度显示。 部分 MySQL 客户端可能只显示 n 个字节的内容,即使实际长度大于 n。

4. 建议

在定义字段长度时,应充分考虑业务需求,避免浪费存储空间或造成数据截断。 对于字符串类型,建议使用 varchar 类型,以节省存储空间。 对于数值类型,建议根据实际情况选择合适的长度,避免数据溢出。 示例

用户姓名字段:可以使用 varchar(50) 存储,因为大多数用户的姓名不会超过 50 个字符。 订单金额字段:可以使用 decimal(10,2) 存储,其中 10 代表整数位数,2 代表小数位数。 主键字段:可以使用 bigint(20) 存储,以保证足够大的存储空间。 总结

数据库字段长度的定义需要根据实际情况进行选择,以满足业务需求并提高存储和查询效率

字段个数

数据库表字段个数限制

在数据库设计中,对表字段个数进行限制是非常必要的。过多的字段会带来以下问题:

降低数据库的查询效率:每个字段都需要存储空间和索引空间,字段越多,需要的存储空间和索引空间就越大,查询效率也会越低。 增加数据库的维护成本:字段越多,数据库的维护成本就越高,例如增加字段、删除字段、修改字段类型等操作都会变得更加复杂。 降低数据库的稳定性:过多的字段可能会导致数据库运行缓慢甚至崩溃。

建议:

每张表的字段个数尽量控制在20个以内。

如果确实需要使用大量字段,可以将一张表拆分成多张小表,这几张表的主键相同。

在拆分表时,应遵循以下原则:

每个表存储的字段应具有相同的业务逻辑。 每个表的字段个数应尽量均匀分布。 主键字段应尽量选择唯一性较强的字段。 示例:

一个用户表,可以拆分成以下几张表:

用户基本信息表:存储用户姓名、年龄、性别等基本信息。 用户联系方式表:存储用户电话号码、邮箱地址等联系方式。 用户订单表:存储用户订单信息。

总结:

对数据库表字段个数进行限制可以提高数据库的查询效率、降低维护成本和提高稳定性。建议根据实际情况进行拆分表,以满足业务需求并优化数据库性能。

约束

主键

数据库表主键设计

1. 主键的必要性

在数据库表设计中,主键是必不可少的。它具有以下功能:

唯一标识表中的每一行数据:主键的值必须是唯一的,不能重复。 提高数据查询效率:主键自带了主键索引,查询效率最高。 保持数据完整性:主键可以用于判断数据是否完整。

2. 主键的选择

主键建议选择与业务无关的值,减少业务耦合性,方便今后的扩展。 可以使用自增长的整数作为主键,但要注意在分布式数据库中,自增主键可能无法保证全局唯一性。 在分布式数据库中,建议使用雪花算法等外部算法生成主键,以保证全局唯一性。

3. 主键的设计原则

主键应尽量选择较短的字段,以节省存储空间。 主键应尽量选择不会频繁更改的字段,以免影响数据库性能。 主键应尽量选择与业务无关的字段,方便数据迁移和扩展。

4. 主键的应用场景

主键可以用于数据查询:通过主键可以快速找到指定的数据行。 主键可以用于数据更新:通过主键可以快速更新指定的数据行。 主键可以用于数据删除:通过主键可以快速删除指定的数据行。

5. 主键的注意事项

主键的值必须是唯一的,不能重复。 主键不能为 null。 主键不能频繁更改。

示例

用户表:可以使用用户 ID 作为主键。 订单表:可以使用订单 ID 作为主键。 商品表:可以使用商品 ID 作为主键。

总结

主键是数据库表中非常重要的一个字段,它不仅可以提高数据查询效率,还可以保证数据完整性。在设计主键时,应遵循上述原则,以满足业务需求并优化数据库性能。

关于一对一关系

“一对一”关系中,如果两个表之间存在强依赖关系,可以将子表的主键设置为父表的主键。这样可以简化表结构,提高数据查询效率。

例如,用户表和用户扩展表之间存在一对一的关系,用户扩展表的主键可以设置为用户表的主键。这样,在查询用户扩展信息时,可以直接通过用户 ID 进行查询。

但是,如果两个表之间不存在强依赖关系,建议将两个表的主键设置为不同的字段。这样可以提高表的独立性和可扩展性。

例如,订单表和订单详情表之间存在一对一的关系,订单详情表的主键可以设置为订单 ID 加上一个自增长的字段。这样,在查询订单详情信息时,可以通过订单 ID 进行查询,也可以通过订单详情 ID 进行查询。

NOT NULL

数据库字段设置 NOT NULL 和默认值 在数据库表设计中,设置字段是否允许为 NULL 是一个重要的决定。在大多数情况下,建议将字段设置为 NOT NULL,并设置默认值。

设置 NOT NULL 的原因

节省存储空间:在 InnoDB 存储引擎中,NULL 值需要额外的空间存储,设置为 NOT NULL 可以节省存储空间。 提高查询效率:NULL 值会导致索引失效,降低查询效率。 提高数据完整性:NOT NULL 可以确保字段的值不能为空,提高数据完整性。

设置默认值的原因

避免插入数据时报错:如果字段设置为 NOT NULL,而没有设置默认值,则在插入数据时,如果该字段没有赋值,就会报错。 方便数据迁移:在新增字段时,如果设置了默认值,则在进行数据迁移时,可以避免新字段出现 NULL 值。

示例

用户姓名字段:可以设置为 NOT NULL,并设置默认值为空字符串。 用户年龄字段:可以设置为 NOT NULL,并设置默认值为 0。 订单金额字段:可以设置为 NOT NULL,并设置默认值为 0.00。

注意事项

在设置默认值时,应考虑业务需求,选择合适的默认值。

如果字段的值可能为 NULL,则应考虑使用其他方法来处理,例如:

使用可空字段类型 使用特殊值表示 NULL

总结 在大多数情况下,建议将字段设置为 NOT NULL,并设置默认值。这样做可以节省存储空间、提高查询效率、提高数据完整性,并方便数据迁移。

外键

MySQL 外键使用建议 外键的作用

外键是数据库中用于维护数据一致性和完整性的约束。它通过将一张表中的字段与另一张表中的字段进行关联,来保证数据之间的逻辑关系。

外键的优点

确保数据的一致性:外键可以防止数据出现矛盾或错误。 提高数据完整性:外键可以保证数据不会被意外删除或修改。 简化数据操作:外键可以简化数据查询和更新操作。

外键的缺点

降低性能:外键可能会降低数据库的插入、更新和删除性能。 增加复杂性:外键会增加数据库设计的复杂性。 使用建议

在需要保证数据一致性和完整性的情况下,建议使用外键。 在对性能要求较高的系统中,可以考虑不使用外键,而是通过应用程序代码来保证数据一致性和完整性。 如果需要使用外键,应尽量减少外键的数量和复杂度。

示例

订单表和订单详情表之间可以建立外键关系,以保证订单数据的一致性和完整性。 用户表和用户角色表之间可以建立外键关系,以保证用户权限的一致性和完整性。

替代方案

应用程序代码:可以使用应用程序代码来检查数据的一致性和完整性。 触发器:可以使用触发器来保证数据的一致性和完整性。

总结

外键是一种有用的工具,可以帮助您维护数据库数据的一致性和完整性。但是,外键也可能降低性能和增加复杂性。因此,在使用外键之前,应仔细考虑您的需求。

唯一索引

MySQL 唯一索引使用建议

1. 唯一索引简介

唯一索引是一种数据库约束,它确保数据库表中每个字段的组合都是唯一的。

2. 唯一索引优势

保证数据唯一性:可以防止数据重复插入。 提高数据完整性:可以确保数据的准确性。 加速数据查询:可以利用唯一索引快速找到指定的数据行。

3. 使用场景

唯一标识:例如:用户 ID、商品 ID 等。 业务主键:例如:订单号、发票号等。 组合字段:例如:姓名、身份证号码等。

4. 注意事项

唯一索引字段不能包含 null 值,否则唯一性约束会失效。 联合唯一索引的字段顺序会影响索引的效率,应根据查询条件进行排序。 创建唯一索引会增加数据库的存储空间和维护成本。

5. 示例

用户表:可以使用唯一索引约束用户 ID 的唯一性。 订单表:可以使用唯一索引约束订单号的唯一性。 商品表:可以使用联合唯一索引约束商品的名称、规格和型号的唯一性。

6. 唯一索引失效

以下情况会导致唯一索引失效:

唯一索引字段包含 null 值。 使用了 like 或 != 等模糊查询操作。 使用了 COUNT() 或 AVG() 等聚合函数。

总结

唯一索引是一种非常有用的数据库约束,可以保证数据唯一性、提高数据完整性和加速数据查询。在设计数据库表时,应根据业务需求合理使用唯一索引。

性能优化

存储引擎

MySQL存储引擎选择建议

1. MySQL 8 之前的版本

在 MySQL 8 之前的版本中,默认的存储引擎是 MyISAM,而 InnoDB 是可选的存储引擎。两种存储引擎各有优缺点:

MyISAM

优点:查询速度快,支持全文索引,表结构简单。 缺点:不支持事务和外键,不适合写多读少的场景。 InnoDB

优点:支持事务和外键,支持行锁,数据安全性高,适合写多读少的场景。 缺点:查询速度比 MyISAM 慢,不支持全文索引。 选择建议

读多写少的表,建议使用 MyISAM 存储引擎。 写多读多的表,建议使用 InnoDB 存储引擎。

2. MySQL 8 及更高版本

在 MySQL 8 及更高版本中,默认的存储引擎改为 InnoDB。这是因为 InnoDB 在性能、功能和安全性方面都得到了很大的提升,已经能够满足大多数应用的需求。

InnoDB 的改进

查询性能:InnoDB 的查询性能得到了大幅提升,与 MyISAM 的差距已经很小。

全文索引:InnoDB 在 MySQL 5.6 版本中开始支持全文索引。

其他功能:InnoDB 还支持许多其他功能,例如:

外键行锁事务热备份选择建议

在 MySQL 8 及更高版本中,建议直接使用默认的 InnoDB 存储引擎,无需额外修改存储引擎。

3. 特殊情况

在一些特殊情况下,可能仍然需要使用 MyISAM 存储引擎,例如:

需要使用全文索引,并且对查询速度要求较高。 需要使用非常大的表,而 InnoDB 存储引擎无法满足需求。

总结

在大多数情况下,建议使用 InnoDB 存储引擎。InnoDB 在性能、功能和安全性方面都得到了很大的提升,已经能够满足大多数应用的需求。 MySQL 官方已经不再积极开发 MyISAM 存储引擎,建议用户在新的应用中尽量使用 InnoDB 存储引擎。

索引

数据库索引设计建议

1. 索引的必要性

索引是数据库中用于提高数据查询效率的一种数据结构。它可以帮助数据库快速找到指定的数据行。

2. 索引的类型

主键索引:主键索引是唯一索引,用于保证数据的一致性和完整性。普通索引:普通索引是非唯一索引,用于提高数据查询效率。联合索引:联合索引是多个字段组合而成的索引,可以提高多字段查询效率。

3. 索引设计原则

索引字段应该经常出现在 where 子句中。 索引字段应该具有较高的区分度。 索引字段不宜过多,建议单表索引个数不要超过 5 个。 对于数据重复率非常高的字段,不建议单独创建索引。

4. 索引失效

索引失效是指索引无法被数据库使用的现象。索引失效的原因有很多,常见的原因包括:

查询条件不满足最左匹配原则。 使用了 like 或 != 等模糊查询操作。 使用了 COUNT() 或 AVG() 等聚合函数。

5. 索引优化

尽量使用覆盖索引:覆盖索引是指索引包含查询的所有字段,这样可以避免回表操作。 使用合适的数据类型:使用合适的字段类型可以提高索引的效率。 定期维护索引:定期重建或分析索引可以保持索引的最佳状态。

6. 示例

商品表:可以创建 spu_id 和 brand_id 的普通索引,以提高商品查询效率。 用户表:可以创建 name 和 age 的联合索引,以提高用户查询效率。

总结

索引是数据库中非常重要的一个概念,可以显著提高数据库查询效率。在设计索引时,应遵循上述原则,以满足业务需求并优化数据库性能。

关于联合索引的最左匹配原则

最左匹配原则指的是,在使用联合索引进行查询时,查询条件必须从联合索引的最左边的字段开始匹配,如果查询条件不满足最左匹配原则,则索引可能无法被使用。

例如,假设有一个联合索引 (a, b),则以下查询可以利用索引:

SELECT * FROM table WHERE a = 1 AND b = 2;

SELECT * FROM table WHERE a = 1;

但以下查询无法利用索引:

SELECT * FROM table WHERE b = 2;

SELECT * FROM table WHERE a > 1;

在设计联合索引时,应考虑业务需求,选择合适的字段顺序,以提高索引的利用率。

排序规则

MySQL 字符排序规则选择建议

1. 字符排序规则简介

字符排序规则是指对字符进行排序的规则。MySQL 支持多种字符排序规则,常见的有:

utf8mb4_general_ci:不区分大小写,适用于不区分大小写的比较操作。 utf8mb4_bin:区分大小写,适用于区分大小写的比较操作。

2. 字符排序规则选择建议

业务场景:如果业务场景需要区分大小写,则选择 utf8mb4_bin 排序规则。如果业务场景不需要区分大小写,则选择 utf8mb4_general_ci 排序规则。 性能:utf8mb4_general_ci 排序规则的性能略好于 utf8mb4_bin 排序规则。

3. 其他注意事项

字符集和排序规则:字符排序规则与字符集相关,应选择与字符集匹配的排序规则。 索引:如果使用索引进行查询,则应选择与索引一致的排序规则。

4. 示例

用户表:如果需要区分用户登录名的大小写,则可以使用 utf8mb4_bin 排序规则。 商品表:如果商品名称不区分大小写,则可以使用 utf8mb4_general_ci 排序规则。

5. 字符排序规则比较

排序规则区分大小写性能适用场景utf8mb4_general_ci否优不区分大小写的比较操作utf8mb4_bin是良区分大小写的比较操作

总结

字符排序规则选择非常重要,会影响数据库的查询效率和结果。在选择字符排序规则时,应充分考虑业务需求和性能因素。

关于区分大小写

区分大小写是指对字符的大小写进行区分。例如,“A” 和 “a” 是两个不同的字符。

在 MySQL 中,可以使用 COLLATE 参数来设置字符排序规则。例如:

CREATE TABLE `user` (

`id` bigint NOT NULL AUTO_INCREMENT,

`username` varchar(20) COLLATE utf8mb4_bin NOT NULL,

PRIMARY KEY (`id`)

);

示例中,username 字段的排序规则设置为 utf8mb4_bin,区分大小写。

关于索引

如果使用索引进行查询,则应选择与索引一致的排序规则。例如,如果索引的排序规则是 utf8mb4_bin,则查询条件也应区分大小写。

特殊字段

时间字段

数据库时间字段类型选择建议

在数据库设计中,时间字段的类型选择非常重要。选择合适的类型可以提高数据查询效率、节省存储空间,并避免数据错误。

1. 时间字段类型

MySQL 支持以下时间字段类型:

DATE:用于保存日期,例如:2023-11-16。 DATETIME:用于保存日期和时间,例如:2023-11-16 12:34:56。 TIMESTAMP:用于保存日期和时间,并带有时区信息,例如:2023-11-16 12:34:56+08:00。 VARCHAR:可以保存任何字符串,包括日期和时间,例如:2023-11-16 12:34:56。

2. 类型选择建议

日期:如果只需要保存日期,建议使用 DATE 类型。 日期和时间:如果需要保存日期和时间,建议使用 DATETIME 类型。 日期和时间,并带有时区信息:如果需要保存日期和时间,并带有时区信息,建议使用 TIMESTAMP 类型。 特殊情况:如果需要保存特殊格式的日期和时间,例如:时间戳,可以使用 VARCHAR 类型。

3. 其他注意事项

默认值:建议不要将时间字段的默认值设置为 ‘0000-00-00 00:00:00’,因为它可能导致数据转换错误。 时区:如果使用 TIMESTAMP 类型,应注意时区问题。

4. 示例

用户表:可以使用 DATETIME 类型保存用户的注册时间。 订单表:可以使用 DATETIME 类型保存订单的创建时间和完成时间。 日志表:可以使用 TIMESTAMP 类型保存日志的时间。

总结

时间字段类型选择非常重要,应根据实际需求选择合适的类型。选择合适的类型可以提高数据查询效率、节省存储空间,并避免数据错误。

金额字段

MySQL 浮点数类型选择建议 在 MySQL 数据库中,有多个字段可以表示浮点数,包括 float、double 和 decimal。

1. 浮点数类型简介

FLOAT:单精度浮点数,占用 4 个字节存储空间,有效数字为 7 位。 DOUBLE:双精度浮点数,占用 8 个字节存储空间,有效数字为 15 位。 DECIMAL:定点类型,占用存储空间与定义精度相关,可精确表示数值。

2. 类型选择建议

对于需要精确计算的场景,例如:金额计算,建议使用 DECIMAL 类型。 对于对精度要求不高的场景,例如:科学计算,可以使用 FLOAT 或 DOUBLE 类型。

3. DECIMAL 类型详解

DECIMAL 类型可以定义两个参数:

M:表示整数和小数部分的总位数,范围为 1 到 65。 D:表示小数部分的位数,范围为 0 到 M。 例如,DECIMAL(10,2) 表示总位数为 10,小数位数为 2,可表示的数值范围为 -99999999.99 到 99999999.99。

4. 其他注意事项

DECIMAL 类型在存储时会进行四舍五入,例如:123.456 会被四舍五入为 123.46。 DECIMAL 类型在比较时会精确比较,例如:123.45 和 123.4500 是相等的。

5. 示例

订单表:可以使用 DECIMAL 类型保存订单金额。 产品表:可以使用 DECIMAL 类型保存产品价格。 用户表:可以使用 DECIMAL 类型保存用户余额。

总结

在 MySQL 数据库中,选择合适的浮点数类型非常重要。DECIMAL 类型可以精确表示数值,适合需要精确计算的场景。FLOAT 和 DOUBLE 类型占用存储空间较小,适合对精度要求不高的场景。

json字段

MySQL JSON字段类型使用建议

1. JSON字段类型简介

MySQL 5.7.8 及更高版本支持 JSON 数据类型,可以用于存储 JSON 格式的结构化数据。

2. JSON字段类型优势

灵活:可以存储任意结构的 JSON 数据,例如:对象、数组、字符串、数字等。 方便:可以使用 JSON 函数直接操作 JSON 数据,例如:添加、删除、修改、查询等。 高效:MySQL 对 JSON 数据进行了优化,查询效率较高。

3. 使用场景

存储不固定的数据结构:例如:用户设置、查询条件等。 存储复杂的数据结构:例如:树形结构、图结构等。 存储半结构化数据:例如:XML 数据、JSON 数据等。

4. 示例

用户表:可以使用 JSON 类型保存用户的个性化设置。 订单表:可以使用 JSON 类型保存订单的详细信息。 日志表:可以使用 JSON 类型保存日志的详细信息。

5. 其他注意事项

JSON 字段类型不能设置默认值。 JSON 字段类型不能用于主键或索引。 JSON 字段类型在使用时需要进行类型转换。

6. JSON 函数示例

JSON_EXTRACT():用于提取 JSON 数据中的某个字段值。 JSON_SET():用于修改 JSON 数据中的某个字段值。 JSON_ARRAY_APPEND():用于向 JSON 数组中添加元素。

总结

JSON 字段类型是一种非常灵活的数据类型,可以用于存储各种结构化的数据。在设计数据库表时,如果需要存储不固定的数据结构、复杂的数据结构或半结构化数据,可以考虑使用 JSON 字段类型。

大字段

MySQL 大字段存储建议

1. 大字段简介

大字段是指占用较多存储空间的字段,例如:用户评论、合同文档等。

2. 大字段存储问题

浪费存储空间:如果使用不合适的字段类型,可能会浪费存储空间。 降低性能:大字段会导致数据库操作的性能下降。

3. 大字段存储建议

根据实际情况选择合适的字段类型: 可控长度的大字段:如果字段长度可控,建议使用 VARCHAR 类型。 不可控长度的大字段:如果字段长度不可控,建议使用 TEXT 或 BLOB 类型。 分离存储:对于非常大的字段,可以考虑将数据存储在外部文件系统中,并在数据库中保存文件路径。 压缩:可以对大字段进行压缩,以节省存储空间。

4. 示例

用户评论:可以使用 VARCHAR(500) 类型存储用户评论。 合同文档:可以使用 MEDIUMTEXT 或 LONGBLOB 类型存储合同文档。 图片:可以使用 BLOB 类型存储图片。

5. 其他注意事项

索引:大字段不宜创建索引,否则会降低查询性能。 字符集:对于存储文本的大字段,应选择合适的字符集,避免出现乱码问题。

6. 分离存储

对于非常大的字段,例如:合同文档、图片等,可以考虑将数据存储在外部文件系统中,并在数据库中保存文件路径。

例如,可以将合同文档存储在 /data/contracts 目录中,并在数据库中保存以下数据:

CREATE TABLE `contract` (

`id` bigint NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL,

`path` varchar(255) NOT NULL,

PRIMARY KEY (`id`)

);

示例中,contract 表保存了合同的名称和文件路径。

7. 压缩

可以对大字段进行压缩,以节省存储空间。

例如,可以使用 MySQL 的 COMPRESSION 选项来压缩 BLOB 类型的数据:

CREATE TABLE `image` (

`id` bigint NOT NULL AUTO_INCREMENT,

`data` BLOB COMPRESSION 'zlib',

PRIMARY KEY (`id`)

);

示例中,image 表中的 data 字段使用 ZLIB 算法进行压缩。

总结

大字段存储需要根据实际情况选择合适的方法。建议根据字段长度、存储空间和性能要求等因素综合考虑。

其他

字符集

MySQL 字符集选择建议

1. 字符集简介

字符集是指一组字符的集合,每个字符都对应一个编码。MySQL 支持多种字符集,常见的有:

latin1:西欧字符集,不包含中文。 GBK:中文字符集,不包含国际通用字符。 UTF-8:通用字符集,支持大部分语言。 UTF8MB4:UTF-8 的扩展版本,支持所有 Unicode 字符。

2. 字符集选择建议

国际化项目:建议使用 UTF8MB4 字符集,可以支持所有语言。 中文项目:建议使用 UTF8MB4 字符集,可以支持中文和 emoji 表情。 存储空间有限:如果存储空间有限,可以考虑使用 UTF-8 字符集,但需要注意 emoji 表情可能无法存储。

3. 其他注意事项

数据库和表的字符集应保持一致。 客户端的字符集应与数据库的字符集一致,避免出现乱码问题。

4. 示例

国际化网站:可以使用 UTF8MB4 字符集保存用户姓名、地址等信息。 中文网站:可以使用 UTF8MB4 字符集保存文章标题、内容等信息。 移动应用:可以使用 UTF8MB4 字符集保存用户昵称、头像等信息。

5. 字符集转换

如果需要将数据库的字符集进行转换,可以使用以下工具:

MySQL自带的 mysqldump 和 mysqlimport 工具 第三方工具,例如:Navicat

总结

字符集选择非常重要,会影响数据库的存储空间、性能和兼容性。在选择字符集时,应充分考虑业务需求和技术因素。

冗余字段

MySQL 冗余字段设计建议

1. 冗余字段简介

冗余字段是指在数据库的多个表中重复出现的字段。

2. 冗余字段优势

提高查询性能:可以减少表连接操作,提高查询效率。 简化查询逻辑:可以避免复杂的表连接操作,简化查询逻辑。

3. 冗余字段劣势

浪费存储空间:会增加数据库的存储空间。 数据不一致:需要维护多个字段的一致性,否则会导致数据不一致问题。

4. 冗余字段应用场景

查询频率高的字段:对于查询频率高的字段,可以考虑冗余到其他表中,以提高查询性能。 关联查询复杂:如果关联查询比较复杂,也可以考虑冗余字段来简化查询逻辑。

5. 冗余字段设计建议

评估收益和成本:在使用冗余字段之前,应充分评估收益和成本。 选择合适的字段:选择合适的字段进行冗余,避免冗余过多的字段。 维护数据一致性:需要维护冗余字段的一致性,避免数据不一致问题。

6. 示例

订单表:可以冗余用户姓名、收货地址等信息,以提高订单查询性能。 商品表:可以冗余商品分类名称、品牌名称等信息,以简化商品查询逻辑。

7. 其他注意事项

冗余字段不宜用于主键或索引:冗余字段可能会导致主键或索引冗余,降低数据库性能。 冗余字段应定期更新:冗余字段应定期更新,以保证数据一致性。

8. 数据一致性问题

冗余字段可能会导致数据不一致问题。例如,如果用户名称修改了,则需要同时修改订单表中的冗余字段。

为了解决数据一致性问题,可以采取以下措施:

使用触发器:可以使用触发器自动更新冗余字段。 应用程序更新:在应用程序中更新冗余字段,确保数据一致性。

总结

冗余字段是一种提高查询性能的有效方法,但同时也存在一些问题。在使用冗余字段之前,应充分评估收益和成本,并采取措施保证数据一致性。

注释

数据库表设计注释的重要性 1. 注释简介

注释是数据库表和字段的说明文字,可以帮助用户理解数据库结构和字段含义。

2. 注释的重要性

提高可读性:注释可以提高数据库表的可读性,方便用户理解数据库结构。 降低维护成本:注释可以降低数据库表的维护成本,方便用户查找和修改字段。 避免数据错误:注释可以避免数据错误,帮助用户正确使用数据库。

3. 注释建议

表注释:表注释应说明表的用途和功能。 字段注释:字段注释应说明字段的含义、数据类型、取值范围等信息。 状态字段注释:对于状态字段,应详细说明每个状态值的含义。 示例:

CREATE TABLE `sys_dept` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',

`name` varchar(30) NOT NULL COMMENT '部门名称',

`pid` bigint NOT NULL COMMENT '上级部门ID',

`valid_status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效状态 1:有效 0:无效',

`create_user_id` bigint NOT NULL COMMENT '创建人ID',

`create_user_name` varchar(30) NOT NULL COMMENT '创建人名称',

`create_time` datetime(3) DEFAULT NULL COMMENT '创建时间',

`update_user_id` bigint DEFAULT NULL COMMENT '修改人ID',

`update_user_name` varchar(30) DEFAULT NULL COMMENT '修改人名称',

`update_time` datetime(3) DEFAULT NULL COMMENT '修改时间',

`is_del` tinyint(1) DEFAULT '0' COMMENT '是否删除 1:已删除 0:未删除',

PRIMARY KEY (`id`) USING BTREE,

KEY `index_pid` (`pid`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='部门';

示例中,对表和字段都进行了详细的注释。

4. 其他注意事项

注释应简洁明了:注释应简洁明了,避免使用过于复杂或模糊的语言。 注释应保持更新:当数据库结构或字段含义发生变化时,应及时更新注释。

5. 总结

数据库表设计注释非常重要,可以提高数据库的可读性、维护性和安全性。在设计数据库表时,应认真编写注释,并定期更新注释。