Become a sponsor

说明
本文介绍本项目的数据库设计规范,包括表命名、字段类型选择、索引策略、常见表模式等。
| 规则 | 说明 | 示例 |
|---|---|---|
| 前缀 | 统一使用 django_ 前缀 | django_user |
| 命名 | 小写字母 + 下划线 | django_role_menu |
| 关联表 | 两张表名拼接 | django_user_role |
| 日志表 | 模块名 + _log | django_login_log |
class Example(BaseModel):
class Meta:
db_table = 'django_example' # 表名
db_comment = '案例表' # 表注释| Django 类型 | MySQL 类型 | 适用场景 | 示例 |
|---|---|---|---|
AutoField | INT AUTO_INCREMENT | 主键 | id |
CharField | VARCHAR | 短文本 | 用户名、标题 |
TextField | TEXT | 长文本 | 文章内容、备注 |
IntegerField | INT | 整数 | 状态、排序、数量 |
BigIntegerField | BIGINT | 大整数 | 时间戳、耗时 |
DecimalField | DECIMAL | 精确小数 | 金额、价格 |
DateTimeField | DATETIME | 日期时间 | 创建时间、更新时间 |
BooleanField | TINYINT | 布尔值 | 是否启用 |
| 字段类型 | 建议长度 | 说明 |
|---|---|---|
| 用户名 | 50 | CharField(max_length=50) |
| 标题 | 150-255 | CharField(max_length=150) |
| URL/路径 | 255 | CharField(max_length=255) |
| 编码/标识 | 100 | CharField(max_length=100) |
| 手机号 | 20 | CharField(max_length=20) |
| 邮箱 | 100 | CharField(max_length=100) |
| 备注 | 255 | CharField(max_length=255) |
| 内容 | 无限制 | TextField() |
所有业务模型继承 BaseModel,自动包含 6 个公共字段:
# application/models.py
class BaseModel(models.Model):
"""基础模型类"""
class Meta:
abstract = True
id = models.AutoField(primary_key=True, verbose_name='主键ID')
create_user = models.CharField(max_length=50, null=True, blank=True, verbose_name='创建人')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_user = models.CharField(max_length=50, null=True, blank=True, verbose_name='更新人')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
is_delete = models.IntegerField(default=0, verbose_name='是否删除:0-正常 1-已删除')字段排序
通过 class_prepared 信号,BaseModel 的公共字段会自动排在业务字段之后,保证数据库表结构的可读性。
| 类型 | Django 配置 | 说明 |
|---|---|---|
| 单列索引 | db_index=True | 单字段查询 |
| 唯一索引 | unique=True | 唯一性约束 |
| 复合索引 | index_together | 多字段联合查询 |
class Example(BaseModel):
name = models.CharField(max_length=100, db_index=True) # 常用查询字段
code = models.CharField(max_length=100, unique=True) # 唯一编码
status = models.IntegerField(db_index=True) # 状态字段
category_id = models.IntegerField(db_index=True) # 外键字段
class Meta:
db_table = 'django_example'
index_together = [
['status', 'is_delete'], # 复合索引:状态 + 软删除
['category_id', 'sort'], # 复合索引:分类 + 排序
]1. 不要过度索引:每个索引都会降低写入性能
2. 选择性高的字段优先:username 比 status 选择性更高
3. 复合索引顺序:选择性高的字段放前面
4. 覆盖索引:查询字段都在索引中时,无需回表
5. 定期分析:使用 EXPLAIN 分析慢查询class Category(BaseModel):
"""树形结构表(parent_id)"""
name = models.CharField(max_length=100)
parent_id = models.IntegerField(default=0) # 0 表示顶级
sort = models.IntegerField(default=0)
class Meta:
db_table = 'django_category'class RoleMenu(BaseModel):
"""角色菜单关联表"""
role_id = models.IntegerField(db_index=True)
menu_id = models.IntegerField(db_index=True)
class Meta:
db_table = 'django_role_menu'class ConfigItem(BaseModel):
"""配置项表(键值对)"""
code = models.CharField(max_length=100, unique=True) # 配置编码
value = models.CharField(max_length=1000) # 配置值
type = models.CharField(max_length=50) # 值类型
class Meta:
db_table = 'django_config_item'class LoginLog(BaseModel):
"""登录日志表"""
username = models.CharField(max_length=50, db_index=True)
ip = models.CharField(max_length=50)
status = models.IntegerField(default=0)
log_type = models.IntegerField(default=1)
class Meta:
db_table = 'django_login_log'# 为指定应用创建迁移
python manage.py makemigrations example
# 为所有应用创建迁移
python manage.py makemigrations# 执行所有未执行的迁移
python manage.py migrate
# 执行指定应用的迁移
python manage.py migrate example
# 回滚到指定迁移
python manage.py migrate example 00011. 先备份:生产环境执行迁移前先备份数据库
2. 测试环境验证:先在测试环境验证迁移脚本
3. 分批执行:大数据表的迁移分批执行,避免锁表
4. 不要修改已提交的迁移:已提交到 Git 的迁移文件不要修改
5. 生成迁移后检查:检查生成的迁移文件是否符合预期项目通过 DATABASE_ENGINE 环境变量支持多种数据库:
# .env
# 可选值:mysql / postgresql / sqlite / oracle / sqlserver
DATABASE_ENGINE=mysql
DATABASE_NAME=djangoadmin
DATABASE_HOST=127.0.0.1
DATABASE_PORT=3306
DATABASE_USER=root
DATABASE_PASSWORD=root| 特性 | MySQL | PostgreSQL | SQLite |
|---|---|---|---|
| 自增主键 | AUTO_INCREMENT | SERIAL | AUTOINCREMENT |
| 布尔类型 | TINYINT | BOOLEAN | INTEGER |
| JSON 字段 | JSON | JSONB | TEXT |
| 全文索引 | FULLTEXT | GIN/GiST | FTS5 |
数据库设计指南涵盖表命名规范、字段类型选择、索引设计、常见表模式、迁移最佳实践、多数据库支持等方面。核心原则:统一命名、合理索引、软删除、公共字段复用。