大型复杂数据库如何进行正向工程从模型建表_模块化切分与管理方案

阿芳同学_2417

阿芳同学_2417

2026-05-11

455人浏览

原创

正向工程建表需避免全库重刷:禁用managed=false模型参与迁移,按模块分目录管理migrations,人工审查sql,禁跨模块外键依赖,适配mysql/pg索引差异,迁移脚本须含执行预估与回滚语句。

正向工程建表时,如何避免模型变更引发全库重刷

直接改 models.py 然后 makemigrations 再 migrate,在小项目里行得通,在大型数据库里等于埋雷。核心问题不是“能不能生成 sql”,而是“生成的 sql 是否可中断、可验证、可回滚”。

  • 必须启用 managed = False 的只读模型仅用于查询,绝不参与迁移;真实建表模型要明确归属模块,比如加前缀 auth_user、billing_invoice
  • 迁移文件必须人工审查:用 python manage.py makemigrations --dry-run --verbosity=2 看实际执行语句,重点检查是否含 ALTER TABLE ... RENAME TO 或隐式 DROP COLUMN
  • 禁止跨模块字段依赖——比如 order 模块的 user_id 外键指向 auth.User,但不要指向另一个业务模块的 customer.Profile,否则切分时外键约束会卡死

Django 中按模块切分 migrations 目录结构怎么设才不翻车

默认所有迁移塞进 migrations/ 一个目录,到 200+ 个迁移文件后,makemigrations 会变慢,更致命的是 migrate 执行顺序错乱导致外键找不到表。

  • 每个 Django app 必须对应独立数据库 schema(通过 db_table 显式指定前缀,如 'auth_user'),且 Meta.app_label 与 app 名一致,不能靠 swappable 混用
  • 迁移目录改造成 migrations/2024_05_billing/、migrations/2024_06_analytics/ 这种时间+模块命名,再配合 python manage.py migrate --plan 验证执行路径
  • 跨模块新增外键时,必须在依赖方迁移中显式声明 dependencies = [('billing', '0012_auto_20240515_1030')],不能靠名字自动推导

MySQL / PostgreSQL 上,正向工程对索引和约束的实际影响差异

同一个 models.CharField(max_length=255, db_index=True),在 MySQL 和 PostgreSQL 上触发的底层操作完全不同,直接影响上线窗口和锁表现。

  • MySQL 5.7+ 对 ADD INDEX 默认阻塞写入,哪怕只是加个普通索引;PostgreSQL 12+ 支持 CONCURRENTLY,但 Django 迁移不自动加这个关键字,得手动写 RunSQL
  • unique_together 在 PostgreSQL 会生成 UNIQUE INDEX,在 MySQL 可能退化为 UNIQUE KEY,如果字段含 NULL,行为不一致——MySQL 认为多个 NULL 不冲突,PostgreSQL 认为冲突
  • 外键级联(on_delete=models.CASCADE)在大表上执行 DELETE 时,PostgreSQL 会锁主表+从表整行,MySQL InnoDB 锁粒度更细但容易死锁,上线前必须在影子库压测

如何让 DBA 接受你的正向工程输出,而不是直接拒掉 PR

DBA 不反感自动化,反感不可控的 DDL。他们真正要的是:可预测的执行耗时、无隐式锁升级、失败后能秒级回退。

  • 所有迁移脚本开头加注释块,明确写出「预计执行时间」「影响行数估算」「是否需停写」「回滚语句」,例如:
    # DURATION: ~42s (based on 12M rows)<br># ROLLBACK: ALTER TABLE billing_invoice DROP COLUMN IF EXISTS is_archived;
  • 禁用 django.db.migrations.operations.RunPython 做数据迁移——DBA 看不见 Python 逻辑,无法审计;改用 RunSQL 并把 SQL 提前给 DBA 过一遍
  • 上线前必须提供「迁移影响报告」:用 python manage.py sqlmigrate billing 0023_add_status 输出原始 SQL,再用 EXPLAIN ANALYZE(PG)或 EXPLAIN FORMAT=TREE(MySQL 8.0+)跑一遍,附上执行计划截图

模块切分不是为了拆代码,是为了让每次 migrate 都落在 DBA 能预判的边界内。最常被跳过的一步是:没在测试库用真实数据量跑一遍迁移,结果上线才发现加个索引锁表 17 分钟。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2705

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3921

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2991

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

967

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2627

5

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2023.10.16

2627

4

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2873

3

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2023.10.19

2441

3

mdf文件导入数据库的方法
mdf文件导入数据库的方法

mdf文件导入数据库的方法有使用SQL Server Management Studio、使用SQL Server命令行工具、使用SQL Server Integration Services等方法。想了解更多mdf文件导入数据库的方法的相关内容,可以阅读本专题下面的文章。

2023.10.23

2633

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习