签入版本
This commit is contained in:
@@ -0,0 +1,228 @@
|
||||
# 数据库设计指南
|
||||
|
||||
:::tip 说明
|
||||
本文介绍本项目的数据库设计规范,包括表命名、字段类型选择、索引策略、常见表模式等。
|
||||
:::
|
||||
|
||||
## 表命名规范
|
||||
|
||||
| 规则 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| 前缀 | 统一使用 `django_` 前缀 | `django_user` |
|
||||
| 命名 | 小写字母 + 下划线 | `django_role_menu` |
|
||||
| 关联表 | 两张表名拼接 | `django_user_role` |
|
||||
| 日志表 | 模块名 + `_log` | `django_login_log` |
|
||||
|
||||
### Django 模型配置
|
||||
|
||||
```python
|
||||
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 公共字段
|
||||
|
||||
所有业务模型继承 `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-已删除')
|
||||
```
|
||||
|
||||
:::tip 字段排序
|
||||
通过 `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
|
||||
```
|
||||
|
||||
### 数据库方言差异
|
||||
|
||||
| 特性 | MySQL | PostgreSQL | SQLite |
|
||||
|------|-------|-----------|--------|
|
||||
| 自增主键 | AUTO_INCREMENT | SERIAL | AUTOINCREMENT |
|
||||
| 布尔类型 | TINYINT | BOOLEAN | INTEGER |
|
||||
| JSON 字段 | JSON | JSONB | TEXT |
|
||||
| 全文索引 | FULLTEXT | GIN/GiST | FTS5 |
|
||||
|
||||
## 总结
|
||||
|
||||
数据库设计指南涵盖表命名规范、字段类型选择、索引设计、常见表模式、迁移最佳实践、多数据库支持等方面。核心原则:统一命名、合理索引、软删除、公共字段复用。
|
||||
Reference in New Issue
Block a user