Skip to content

数据库设计指南

说明

本文介绍本项目的数据库设计规范,包括表命名、字段类型选择、索引策略、常见表模式等。

表命名规范

规则说明示例
前缀统一使用 django_ 前缀django_user
命名小写字母 + 下划线django_role_menu
关联表两张表名拼接django_user_role
日志表模块名 + _logdjango_login_log

Django 模型配置

python
class Example(BaseModel):
    class Meta:
        db_table = 'django_example'  # 表名
        db_comment = '案例表'        # 表注释

字段类型选择

常用字段类型

Django 类型MySQL 类型适用场景示例
AutoFieldINT AUTO_INCREMENT主键id
CharFieldVARCHAR短文本用户名、标题
TextFieldTEXT长文本文章内容、备注
IntegerFieldINT整数状态、排序、数量
BigIntegerFieldBIGINT大整数时间戳、耗时
DecimalFieldDECIMAL精确小数金额、价格
DateTimeFieldDATETIME日期时间创建时间、更新时间
BooleanFieldTINYINT布尔值是否启用

字段长度建议

字段类型建议长度说明
用户名50CharField(max_length=50)
标题150-255CharField(max_length=150)
URL/路径255CharField(max_length=255)
编码/标识100CharField(max_length=100)
手机号20CharField(max_length=20)
邮箱100CharField(max_length=100)
备注255CharField(max_length=255)
内容无限制TextField()

BaseModel 公共字段

所有业务模型继承 BaseModel,自动包含 6 个公共字段:

python
# 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多字段联合查询

索引设计建议

python
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 分析慢查询

常见表模式

树形结构表

python
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'

关联表(多对多)

python
class RoleMenu(BaseModel):
    """角色菜单关联表"""
    role_id = models.IntegerField(db_index=True)
    menu_id = models.IntegerField(db_index=True)

    class Meta:
        db_table = 'django_role_menu'

配置表(KV 结构)

python
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'

日志表

python
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'

数据库迁移最佳实践

创建迁移

bash
# 为指定应用创建迁移
python manage.py makemigrations example

# 为所有应用创建迁移
python manage.py makemigrations

执行迁移

bash
# 执行所有未执行的迁移
python manage.py migrate

# 执行指定应用的迁移
python manage.py migrate example

# 回滚到指定迁移
python manage.py migrate example 0001

迁移注意事项

1. 先备份:生产环境执行迁移前先备份数据库
2. 测试环境验证:先在测试环境验证迁移脚本
3. 分批执行:大数据表的迁移分批执行,避免锁表
4. 不要修改已提交的迁移:已提交到 Git 的迁移文件不要修改
5. 生成迁移后检查:检查生成的迁移文件是否符合预期

多数据库支持

项目通过 DATABASE_ENGINE 环境变量支持多种数据库:

bash
# .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

数据库方言差异

特性MySQLPostgreSQLSQLite
自增主键AUTO_INCREMENTSERIALAUTOINCREMENT
布尔类型TINYINTBOOLEANINTEGER
JSON 字段JSONJSONBTEXT
全文索引FULLTEXTGIN/GiSTFTS5

总结

数据库设计指南涵盖表命名规范、字段类型选择、索引设计、常见表模式、迁移最佳实践、多数据库支持等方面。核心原则:统一命名、合理索引、软删除、公共字段复用。

小蚂蚁云团队 · 提供技术支持