文章目录
- 数据库建库建表规范和原理,白话版
-
- [1. 数据库的字符集:为何utf8成为首选?](#1. 数据库的字符集:为何utf8成为首选?)
- [2. 为什么要注意数据库的排序规则?](#2. 为什么要注意数据库的排序规则?)
- [3. 怎么建表名?](#3. 怎么建表名?)
- [4. 为什么表中会创建id和code?](#4. 为什么表中会创建id和code?)
- [5. 主键id的命名规则](#5. 主键id的命名规则)
- [6. 关联键的命名规则](#6. 关联键的命名规则)
- [7. 为什么要创建create_user,create_time,update_user,upadte_time字段?](#7. 为什么要创建create_user,create_time,update_user,upadte_time字段?)
- [8. 枚举字段的类型应该怎么处理,用Integer还是字符串?](#8. 枚举字段的类型应该怎么处理,用Integer还是字符串?)
- [9. 默认值问题?](#9. 默认值问题?)
- [10. 怎么创建索引?](#10. 怎么创建索引?)
数据库建库建表规范和原理,白话版
1. 数据库的字符集:为何utf8成为首选?
在数据库设计过程中,字符集的选择至关重要。不同的字符集对特殊字符和符号的处理方式各不相同。例如,某些字符集可能无法正确存储或显示某些特殊字符,导致数据乱码。因此,为了确保数据的完整性和准确性,许多数据库管理员和开发者选择使用utf8字符集。
utf8字符集是一种可变长度的Unicode字符集,能够支持全球范围内的各种语言。与其他字符集相比,utf8具有更高的兼容性,能够正确存储和显示各种特殊字符和符号。这使得utf8成为处理多语言数据的理想选择。
2. 为什么要注意数据库的排序规则?
以MySQL 5.7与8.0版本的默认排序规则对比,不同规则使用order by对一个字段排序会有不同的结果
1.MySQL 5.7版本的默认排序规则为utf8mb4_general_ci。这是一种通用的、不区分大小写的排序规则。它适用于大多数情况,但在某些特定场景下,可能会因为大小写不敏感而导致数据比较和排序出现问题。
2.MySQL 8.0版本的默认排序规则为utf8mb4_0900_ai_ci。这是一种更先进的排序规则,基于Unicode 9.0版本,并且支持更精细的字符比较。与utf8mb4_general_ci相比,utf8mb4_0900_ai_ci提供了更高的准确性和灵活性,适用于对字符排序有较高要求的场景。
3. 怎么建表名?
在数据库设计过程中,表名的命名规范同样重要。一个好的表名设计应该能够清晰地表达表的用途和含义,同时方便管理和维护。以下是一个建议的表名设计最佳实践:
1.创建表名一定要有逻辑,比如由以下组成:微服务前缀、模块简称和表达表明含义的名词,如系统服务中用户表SYS_USER,系统服务中用户权限表SYS_USER_ROLE。这种命名方式有助于区分不同微服务的数据表,并清晰地表达表的功能和用途。
2.关联表可以在最后添加"relation"以表明其关联性质。这有助于识别和管理与其他表有关联关系的表。
4. 为什么表中会创建id和code?
在数据库表设计中,我们经常会看到两个相似的字段:id和code。尽管它们在功能上有所相似,即都是用于标识表中每一行数据的唯一性,但在实际的应用场景中,它们分别承担了不同的角色。
1.技术主键(id)
id字段通常作为数据库表的技术主键,用于唯一标识表中的每一行数据。它是数据库内部进行数据操作(如增删改查)的重要依据。此外,id字段还用于建立表与表之间的关联关系,通过外键约束实现数据的完整性和一致性。
1.业务主键(code)
code字段则更多地用于业务层面,它通常具有实际的业务含义,如用户编号、订单号等。code字段的命名通常遵循一定的业务规则,方便业务人员理解和使用。在页面中展示数据时,code字段也常常被用作展示给用户的唯一标识。
5. 主键id的命名规则
在数据库表设计中,主键id的命名规则也是非常重要的。一个合理的命名规则可以提高代码的可读性和可维护性。以下是关于主键id命名的一些建议:
1.避免直接使用"id"作为字段名
尽管"id"是一个简洁的命名,但在实际应用中,如果一个表中直接使用了"id"作为主键字段名,那么在涉及多表联查或者多表关联操作时,可能会因为多个表的"id"字段冲突而导致混淆。因此,建议为每个表的id字段加上表名的前缀,如"user_id"、"order_id"等。
2.培养默契,遵循命名规范
在团队开发中,遵循一定的命名规范可以培养大家的默契,减少沟通成本。对于主键id字段的命名,建议团队内部达成一致,遵循一定的命名规则,如"表名_id"。这样,当团队成员在讨论代码或者排查问题时,可以快速地理解字段的含义和用途。
6. 关联键的命名规则
在数据库表设计中,关联键用于建立表与表之间的关联关系。一个合理的关联键命名规则可以提高代码的可读性和可维护性。以下是关于关联键命名的一些建议:
1.采用"关联的表全称_id"的命名方式
关联键的命名应该清晰地表达出它所关联的表以及它的作用。因此,建议采用"关联的表全称_id"的命名方式。例如,如果一个用户表(user_table)和一个订单表(order_table)之间存在关联关系,那么可以在用户表中创建一个名为"order_table_id"的关联键字段,用于存储与当前用户相关联的订单表的id。
7. 为什么要创建create_user,create_time,update_user,upadte_time字段?
1. 是为了能根据时间排序
2. 是作为日志记录操作时间,人物
8. 枚举字段的类型应该怎么处理,用Integer还是字符串?
可能大部分人都会选择数字,12345等等,美名说为了效率。
1. 使用数字不易维护,如mysql-char为1,mysql-varchar为2,oracle-char为3,当想要添加mysql-text时,不能再使用3,造成mysql类型断层。同时不易理解,需要有字典映射才能明白含义
2. 使用字符串时就不会出现这些问题,比如状态用Normal,Fail。无论是见名知意还是变更维护,都是更简单的
9. 默认值问题?
默认值作为最后一道防线,有些字段一定要加。比如类型,一定不要用null,减少处理null值的逻辑,同时降低自己的代码负担
10. 怎么创建索引?
1. 可以在建表初期根据业务估计直接对一些字段添加索引
2. 或者在运行一段时间后,根据慢查询日志找出查询频率和查询速度较慢的语句,分析后添加索引