Skip to content

💾 数据库规范

🛢️ 数据库规范

系统采用自动化数据库初始化程序,能够根据用户所创建的数据库账号,自动完成表结构的创建与初始数据的导入。通过这种方式,用户无需手动执行 SQL 文件进行数据库初始化,从而简化了操作流程。此举不仅支持多种数据库类型,如 MySQL、MariaDB、Oracle、SQLServer 和 PostgreSQL 等,还避免了维护多个数据库平台的不同 SQL 初始数据语句的问题。系统通过自动化的初始化功能,不仅大大降低了人为操作的失误率,还能根据实际需求灵活地导入扩展模块的数据表和基础数据,实现数据管理的高效性和灵活性。这种自动化、标准化的处理方式极大提升了数据库管理的便捷性与稳定性,为用户提供了一个更加可靠的数据库初始化解决方案。

数据库类型规范

MySQL

系统在 MySQL 数据库中,默认采用utf8mb4字符集,默认使用utf8mb4_general_ci排序规则,默认使用数据库存储引擎InnoDB

utf8mb4_general_ci

定义:通用的不区分大小写的排序规则。

特点:
- 比较快,因为它的比较规则较为简单。
- 不完全符合Unicode标准,在某些情况下可能不够准确。
适用场景:适合对性能要求较高且对排序准确性要求不高的场景。

utf8mb4_unicode_ci

定义:基于Unicode标准的不区分大小写的排序规则。

特点:
- 更加准确,遵循Unicode标准。
- 性能稍差于_general_ci,但在大多数情况下可以接受。
适用场景:适合对排序准确性有较高要求的场景。

utf8mb4_0900_ai_ci

定义:MySQL 8.0引入的新排序规则,基于Unicode 9.0标准,不区分大小写和重音。

特点:
- 支持更多的语言和字符特性。
- 提供更准确的比较和排序结果。
- 性能优化较好,提供更好的国际化支持,适合现代应用。
适用场景:适合需要处理多语言文本和特殊字符的现代应用。

使用建议

  • 如果需要支持表情符号或其他4字节字符:使用utf8mb4。【默认】
  • 如果对性能要求较高且不需要严格的Unicode排序:选择utf8mb4_general_ci。【默认】
  • 如果需要严格的Unicode排序和更好的国际化支持:选择utf8mb4_unicode_ci。【需要严格的Unicode排序时,推荐】
  • 如果需要最新的Unicode标准和不区分重音的支持:选择utf8mb4_0900_ai_ci

InnoDB 存储引擎

InnoDB 是一款兼顾高可靠性和高性能的通用存储引擎。在MySQL8.0中默认的存储引擎是 InnoDB。

数据库命名规范

数据库命名规范对于确保项目的可维护性和可扩展性至关重要。合理的命名有助于开发人员理解数据库结构,减少错误和歧义。以下是常见的数据库命名规范:

1. 数据库命名规范

  • 简洁且描述性:数据库名应清晰表达其用途或业务领域。例如,sales_dbinventory_systemhrms_db
  • 避免使用特殊字符:避免使用空格、连字符(-)和其他特殊字符。使用下划线(_)分隔单词。
  • 小写字母:数据库名通常使用小写字母,采用下划线分隔单词(例如:user_data)。
  • 避免使用保留字:避免使用数据库系统的保留字作为数据库名,例如:SELECTORDER等。

2. 表命名规范

  • 复数形式:表名通常使用复数形式来表示存储多条记录(例如:usersordersproducts)。这能明确表代表了一个数据集合。
  • 描述性命名:表名应准确描述该表所存储数据的内容。例如:employee_recordsorder_itemscustomer_addresses
  • 避免使用表名缩写:为了可读性,表名应尽量避免使用缩写,除非缩写是非常通用的(如idurl)。
  • 小写字母与下划线:表名应采用小写字母和下划线分隔单词(例如:user_profilesorder_details)。
  • 避免前缀:通常不推荐使用表名前缀(如tbl_),这通常是多余的,而且影响可读性。

3. 字段命名规范

  • 简洁且有意义:字段名应简洁且能够清晰表达其数据内容。例如,first_namelast_nameorder_date
  • 小写字母与下划线分隔:字段名应使用小写字母,单词间用下划线分隔(例如:user_idcreated_at)。
  • 避免使用保留字:避免使用SQL保留字作为字段名(如SELECTFROM等)。
  • 字段命名要与业务语境一致:例如,如果字段表示“用户名”,使用username而不是user_nameuserID
  • 使用前缀区分不同的类型:如果一个表有多种类型的数据(如时间戳、标识符等),可以为字段添加适当的前缀,例如:created_atupdated_atuser_id

4. 索引命名规范

  • 表名+列名:索引名可以采用表名_列名_idx的格式,例如:users_email_idxorders_created_at_idx
  • 唯一索引:对于唯一索引,索引名称可以使用unique前缀(例如:unique_email_idx)。
  • 避免使用过长的名称:索引名不应过长,应保持简洁明了。

5. 外键命名规范

  • 表名+列名+fk:外键约束的命名通常采用table_name_column_name_fk的格式,例如:orders_user_id_fkproducts_category_id_fk
  • 描述性:外键名称应该描述所连接的表和列,避免使用无意义的命名。

6. 约束命名规范

  • 命名规则:可以根据约束的类型使用type_column_nametype_table_name_column_name的格式。例如:
    • 主键约束:pk_userspk_orders
    • 唯一约束:unique_emailunique_username
    • 检查约束:check_order_totalcheck_age

7. 视图命名规范

  • 表名+视图:视图的命名应能够表达视图的业务用途,通常使用table_name_view的格式。例如:user_profile_vieworder_summary_view
  • 简洁而富有描述性:视图名称应清晰地描述视图中数据的含义和来源,避免使用过于复杂的名称。

8. 存储过程和函数命名规范

  • 操作+表名:存储过程和函数的命名应反映它们执行的操作以及所作用的表。通常使用动词加表名的格式,例如:insert_userupdate_order_statusdelete_product
  • 简洁且可理解:避免存储过程或函数名称过长,保持简洁且易于理解。

9. 触发器命名规范

  • 触发时间+操作类型+表名:触发器的命名通常包括触发时间(如beforeafter)和操作类型(如insertupdatedelete),加上表名。例如:before_insert_usersafter_update_orders

10. 命名的一致性

  • 遵循统一的命名规则:在整个项目中,应始终使用一致的命名规则。保持数据库中的命名统一,有助于其他开发人员理解和维护代码。
  • 避免缩写:尽量避免缩写,因为缩写可能让新成员难以理解代码。

通过遵循这些数据库命名规范,可以确保数据库结构清晰、易于管理和扩展。

数据库表规范

数据库表规范涉及数据库结构的设计,确保数据存储高效、查询快速且易于维护。以下是一些常见的数据库表设计规范:

1. 表命名规范

  • 简洁且描述性:表名应该能够反映表的用途和内容。常见做法是使用复数形式(如usersorders),避免使用过于笼统或含糊的名称。
  • 小写字母与下划线分隔:表名通常使用小写字母,并用下划线分隔单词(例如user_profiles)。这种方式便于阅读和理解。
  • 避免使用保留字:避免使用数据库的保留字作为表名或列名,防止冲突。

2. 字段命名规范

  • 简洁且有意义:字段名称应简洁且能反映其内容。例如,使用first_name代替fname,而非f_name
  • 小写字母与下划线分隔:字段名也使用小写字母和下划线风格(例如user_idcreated_at)。
  • 避免使用数据库保留字:同样避免使用SQL保留字作为字段名。

3. 主键设计

  • 每个表都有主键:每个表应有一个主键来唯一标识记录。主键通常使用自增ID(如id)。
  • 避免过大的复合主键:尽量避免使用多个列作为复合主键,除非绝对必要。

4. 外键设计

  • 维护表之间的关系:对于有依赖关系的表,使用外键约束来保证数据的完整性。
  • 外键列的数据类型应与主键匹配:外键列的类型应与被引用表的主键列类型一致。

5. 索引设计

  • 创建合适的索引:为查询条件中的列(如WHEREJOINORDER BY等)创建索引,以提高查询性能。
  • 避免过多索引:索引可以加速查询,但也会增加插入、更新、删除时的开销。避免在频繁修改的列上创建过多索引。
  • 复合索引:在多个列一起参与查询时,可以创建复合索引,以提升查询性能。但复合索引的列顺序要注意,通常选择选择性高的列放在前面。

6. 数据类型的选择

  • 选择合适的数据类型:根据字段的实际数据类型选择合适的类型,避免使用过大的数据类型。例如,对于存储日期,应使用DATEDATETIME,而不是使用VARCHAR
  • 避免使用过大字段:尽量避免为短小的数据使用过大的数据类型(例如,存储短文本时使用TEXT而不是VARCHAR(255))。

7. NULL值处理

  • 明确是否允许NULL值:为每个字段明确是否允许NULL值。对于业务逻辑上必填的字段,应禁止为NULL
  • 避免过多的NULL值:某些字段如果经常为空,可能表明设计上存在问题,考虑是否需要重构表设计。

8. 表结构优化

  • 正规范化:表设计时应遵循数据库的正则化原则,尽量消除冗余数据,避免数据更新异常。但在特定情况下,可以做适度的反规范化,以提高查询性能。
  • 分区表:对于数据量特别大的表,可以考虑使用分区表来分割数据,改善性能。
  • 避免表过大:对于数据量非常大的表,建议定期清理旧数据,或者将其分区或归档。

9. 事务与锁管理

  • 使用事务:对于需要保证数据一致性的操作,应该使用事务来确保操作的原子性。
  • 合理选择锁粒度:尽量减少锁的粒度,避免长时间锁定大范围的数据表,降低并发性能。

10. 表的历史记录管理

  • 审计表设计:对于重要的记录,考虑设置审计表或历史记录表,记录数据的变化过程。
  • 软删除:考虑采用软删除(即通过标志位而不是物理删除)来保留历史数据,便于追踪。

11. 表的维护与优化

  • 定期优化:随着数据增长,表的性能可能会逐渐下降,定期执行表优化操作(如OPTIMIZE TABLE)来重建索引和整理碎片。
  • 监控查询性能:使用工具(如EXPLAIN)监控查询是否有效利用索引,及时优化查询和索引设计。

通过遵循这些数据库表设计规范,可以确保表结构的高效性、可维护性和查询性能。

数据库索引规范

在MySQL数据库中,合理的索引设计对于提高查询效率非常关键。以下是MySQL数据库索引的一些规范和最佳实践:

1. 索引的使用规范

  • 避免过多索引:每个索引都会占用磁盘空间,并且会在数据插入、更新、删除时增加额外的开销。只为查询频繁的字段添加索引。
  • 选择合适的列创建索引:通常选择以下列创建索引:
    • 经常作为查询条件的列(例如WHERE、JOIN、ORDER BY、GROUP BY等)
    • 经常用于范围查询的列(如大于、小于等)
    • 唯一性较高的列(如主键列、唯一索引列)
  • 避免索引过长的列:对于较长的文本或字符串列,避免将其作为索引列。可以考虑使用前缀索引。

2. 索引类型

  • 主键索引(Primary Key Index):一个表只能有一个主键索引,主键列的值唯一且不能为空。
  • 唯一索引(Unique Index):保证列中的每个值唯一,但可以有多个唯一索引。
  • 普通索引(Index):加速查询,列值可以重复。
  • 全文索引(Fulltext Index):用于对文本进行全文搜索。
  • 复合索引(Composite Index):由多个列组合成的索引,适用于多个列同时作为查询条件的情况。

3. 复合索引设计

  • 列的顺序:复合索引中的列顺序非常重要。索引会按照列的顺序进行查找,因此应该优先将选择性较高的列放在前面。
  • 最左前缀原则:MySQL使用复合索引时,会按照索引中列的顺序进行优化。只有使用到复合索引的最左边的列时,复合索引才能有效。例如,(A, B, C)的索引在查询时,能利用的最左前缀是A(A, B)(A, B, C)

4. 索引优化建议

  • 避免索引列包含NULL值:在创建索引时,包含NULL值的列可能会导致索引效率较低,因为NULL值的比较会影响索引的利用。
  • 避免在低选择性列上创建索引:如果列的值很少变化(例如布尔值或性别字段),则不需要为其创建索引。索引的选择性越高,查询性能提升越显著。
  • 避免在频繁更新的列上创建索引:如果某个列经常被修改,索引会带来额外的维护成本,因为每次修改时,索引也需要更新。

5. 查询优化

  • 利用EXPLAIN命令:使用EXPLAIN命令来查看查询是否使用了索引,并根据执行计划进一步优化索引设计。
  • 避免全表扫描:确保查询能够充分利用索引,避免不必要的全表扫描。

6. 维护索引

  • 定期重建索引:随着表的数据量增大,索引可能会变得不优化,定期重建索引可以提高查询性能。
  • 删除无用索引:经常审查数据库中的索引,删除不再使用的索引,以避免不必要的性能开销。

7. 其他注意事项

  • 不要过度优化:并不是所有查询都需要创建索引。为了性能,应该根据实际的查询需求来决定索引的建立。
  • 适当使用覆盖索引:覆盖索引是指索引包含了查询中所有需要的列,避免了回表查询。设计合适的索引,可以将查询完全通过索引完成,提高查询效率。

这些规范和最佳实践有助于合理设计和使用MySQL数据库中的索引,从而在不影响性能的情况下提高查询速度。