750 lines
23 KiB
Markdown
750 lines
23 KiB
Markdown
# 4.9 数据库设计
|
||
|
||
:::tip 概述
|
||
项目支持 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 五种数据库,通过 `.env` 的 `DATABASE.TYPE` 一键切换。所有数据库共用同一套代码,无需修改业务逻辑。本章涵盖命名规范、表结构设计、字段说明、索引策略和多数据库适配。
|
||
:::
|
||
|
||
## 命名规范
|
||
|
||
| 对象 | 规范 | 示例 |
|
||
|------|------|------|
|
||
| 表名 | `think_` 前缀 + 小写下划线 | `think_user`、`think_article` |
|
||
| 字段名 | 小写下划线 | `create_time`、`user_name` |
|
||
| 主键 | 统一 `id`,INT 自增 | `id INT PRIMARY KEY` |
|
||
| 外键 | `表名_id` | `user_id`、`role_id` |
|
||
| 索引 | `idx_字段名` | `idx_status`、`idx_tenant_id` |
|
||
| 唯一索引 | `uk_字段名` | `uk_username` |
|
||
|
||
## 公共字段
|
||
|
||
所有业务表**必须**包含以下公共字段,由 `BaseModel` 自动维护:
|
||
|
||
```sql
|
||
-- MySQL 格式
|
||
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
|
||
is_delete TINYINT(1) DEFAULT 0 COMMENT '软删除 0=正常 1=已删除',
|
||
create_user VARCHAR(50) DEFAULT '' COMMENT '创建人',
|
||
create_time DATETIME COMMENT '创建时间',
|
||
update_user VARCHAR(50) DEFAULT '' COMMENT '更新人',
|
||
update_time DATETIME COMMENT '更新时间'
|
||
```
|
||
|
||
| 字段 | 自动维护方 | 说明 |
|
||
|------|-----------|------|
|
||
| `is_delete` | BaseModel 软删除机制 | `softDelete()` 设置为 1,全局查询范围自动过滤 |
|
||
| `create_user` | BaseModel `onBeforeInsert` | 取当前登录用户名,无用户时留空 |
|
||
| `create_time` | BaseModel `onBeforeInsert` | 取当前时间,已传入则不覆盖 |
|
||
| `update_user` | BaseModel `onBeforeUpdate` | 取当前登录用户名 |
|
||
| `update_time` | BaseModel `onBeforeUpdate` | 始终覆盖为当前时间 |
|
||
|
||
## 核心表清单
|
||
|
||
### 用户与权限(6 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_user` | 用户表 | BaseTenantLogic |
|
||
| `think_user_role` | 用户角色关联表(N:N 中间表) | — |
|
||
| `think_role` | 角色表 | BaseLogic |
|
||
| `think_role_menu` | 角色菜单关联表(N:N 中间表) | — |
|
||
| `think_menu` | 菜单/权限表 | BaseLogic |
|
||
| `think_dept` | 部门表(树形) | BaseTenantLogic |
|
||
|
||
**关联关系:**
|
||
|
||
```text
|
||
think_user ──┐
|
||
│ N:N (think_user_role)
|
||
think_role ──┤
|
||
│ N:N (think_role_menu)
|
||
think_menu ──┘
|
||
|
||
think_dept ←── think_user.dept_id
|
||
think_tenant ←── think_user.tenant_id
|
||
```
|
||
|
||
### 组织架构(3 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_dept` | 部门表(树形,parent_id) | BaseTenantLogic |
|
||
| `think_position` | 岗位表 | BaseTenantLogic |
|
||
| `think_level` | 职级表 | BaseTenantLogic |
|
||
|
||
### 租户(1 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_tenant` | 租户表 | BaseLogic |
|
||
|
||
### 系统配置(5 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_dict` | 字典表 | BaseLogic |
|
||
| `think_dict_item` | 字典项表 | BaseLogic |
|
||
| `think_config` | 配置组表 | BaseLogic |
|
||
| `think_config_item` | 配置项表 | BaseLogic |
|
||
| `think_param` | 系统参数表 | BaseLogic |
|
||
|
||
**关联关系:**
|
||
|
||
```text
|
||
think_dict ←── think_dict_item.dict_id
|
||
think_config ←── think_config_item.config_id
|
||
```
|
||
|
||
### 内容管理(4 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_article` | 文章表 | BaseTenantLogic |
|
||
| `think_category` | 文章分类表(树形) | BaseTenantLogic |
|
||
| `think_link` | 友情链接表 | BaseTenantLogic |
|
||
| `think_notice` | 通知公告表 | BaseTenantLogic |
|
||
|
||
### 日志审计(2 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_login_log` | 登录日志表 | BaseLogic |
|
||
| `think_operation_log` | 操作日志表 | BaseLogic |
|
||
|
||
### 定时任务(2 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_job` | 定时任务表 | BaseLogic |
|
||
| `think_job_log` | 定时任务执行日志表 | BaseLogic |
|
||
|
||
**关联关系:**
|
||
|
||
```text
|
||
think_job ←── think_job_log.job_id
|
||
```
|
||
|
||
### 基础数据(2 张表)
|
||
|
||
| 表名 | 说明 | Logic 基类 |
|
||
|------|------|-----------|
|
||
| `think_city` | 城市行政区划表(树形,pid) | BaseLogic |
|
||
| `think_file_template` | 文件模板表 | BaseLogic |
|
||
|
||
**共计 25 张业务表**(不含中间表)。
|
||
|
||
## 关键表字段说明
|
||
|
||
### think_user(用户表)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | INT | 主键 |
|
||
| `username` | VARCHAR(50) | 用户名(登录账号) |
|
||
| `password` | VARCHAR(255) | 密码(bcrypt 加密) |
|
||
| `salt` | VARCHAR(50) | 密码盐值 |
|
||
| `realname` | VARCHAR(50) | 姓名 |
|
||
| `gender` | TINYINT | 性别(字典 gender) |
|
||
| `mobile` | VARCHAR(20) | 手机号 |
|
||
| `email` | VARCHAR(100) | 邮箱 |
|
||
| `avatar` | VARCHAR(500) | 头像路径 |
|
||
| `status` | TINYINT | 状态(字典 user_status) |
|
||
| `dept_id` | INT | 部门 ID |
|
||
| `level_id` | INT | 职级 ID |
|
||
| `position_id` | INT | 岗位 ID |
|
||
| `tenant_id` | INT | 租户 ID |
|
||
| `province_code` | VARCHAR(20) | 省编码 |
|
||
| `city_code` | VARCHAR(20) | 市编码 |
|
||
| `district_code` | VARCHAR(20) | 区编码 |
|
||
| `street_code` | VARCHAR(20) | 街道编码 |
|
||
| `city_info` | VARCHAR(200) | 城市名称拼接 |
|
||
| `is_delete` | TINYINT(1) | 软删除 |
|
||
| `create_user` | VARCHAR(50) | 创建人 |
|
||
| `create_time` | DATETIME | 创建时间 |
|
||
| `update_user` | VARCHAR(50) | 更新人 |
|
||
| `update_time` | DATETIME | 更新时间 |
|
||
|
||
### think_role(角色表)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | INT | 主键 |
|
||
| `name` | VARCHAR(50) | 角色名称 |
|
||
| `code` | VARCHAR(50) | 角色编码 |
|
||
| `data_scope` | TINYINT | 数据权限范围:1=全部 2=本部门 3=仅本人 |
|
||
| `status` | TINYINT | 状态 |
|
||
| `remark` | VARCHAR(500) | 备注 |
|
||
| `sort` | INT | 排序 |
|
||
| `...` | | 公共字段 |
|
||
|
||
### think_menu(菜单/权限表)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | INT | 主键 |
|
||
| `parent_id` | INT | 父级 ID(0=顶级) |
|
||
| `name` | VARCHAR(50) | 菜单名称 |
|
||
| `permission` | VARCHAR(100) | 权限标识(如 `sys:user:add`) |
|
||
| `type` | TINYINT | 类型:0=菜单/目录(可导航) 1=权限节点 |
|
||
| `path` | VARCHAR(200) | 路由路径 |
|
||
| `icon` | VARCHAR(100) | 图标 |
|
||
| `sort` | INT | 排序 |
|
||
| `status` | TINYINT | 状态 |
|
||
| `remark` | VARCHAR(500) | 备注 |
|
||
| `...` | | 公共字段 |
|
||
|
||
### think_tenant(租户表)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | INT | 主键 |
|
||
| `name` | VARCHAR(100) | 租户名称 |
|
||
| `code` | VARCHAR(50) | 租户编码(系统自动生成:T+4位ID) |
|
||
| `status` | TINYINT | 状态(字典 tenant_status):0=禁用 1=启用 |
|
||
| `expire_time` | DATETIME | 过期时间 |
|
||
| `max_user_num` | INT | 最大用户数限制 |
|
||
| `contact_name` | VARCHAR(50) | 联系人 |
|
||
| `contact_phone` | VARCHAR(20) | 联系电话 |
|
||
| `remark` | VARCHAR(500) | 备注 |
|
||
| `...` | | 公共字段 |
|
||
|
||
### think_article(文章表)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | INT | 主键 |
|
||
| `title` | VARCHAR(200) | 标题 |
|
||
| `category_id` | INT | 分类 ID |
|
||
| `cover` | VARCHAR(500) | 封面图路径 |
|
||
| `content` | TEXT | 内容(富文本,含 [IMG_URL] 占位符) |
|
||
| `author` | VARCHAR(50) | 作者 |
|
||
| `status` | TINYINT | 状态(字典 article_status):0=正常 1=下架 |
|
||
| `sort` | INT | 排序 |
|
||
| `tenant_id` | INT | 租户 ID |
|
||
| `...` | | 公共字段 |
|
||
|
||
## 索引策略
|
||
|
||
### 推荐索引
|
||
|
||
```sql
|
||
-- 用户表:高频查询字段
|
||
ALTER TABLE think_user ADD INDEX idx_username (username);
|
||
ALTER TABLE think_user ADD INDEX idx_tenant_id (tenant_id);
|
||
ALTER TABLE think_user ADD INDEX idx_dept_id (dept_id);
|
||
ALTER TABLE think_user ADD INDEX idx_status (status);
|
||
|
||
-- 角色关联表:外键索引
|
||
ALTER TABLE think_user_role ADD INDEX idx_user_id (user_id);
|
||
ALTER TABLE think_user_role ADD INDEX idx_role_id (role_id);
|
||
ALTER TABLE think_role_menu ADD INDEX idx_role_id (role_id);
|
||
ALTER TABLE think_role_menu ADD INDEX idx_menu_id (menu_id);
|
||
|
||
-- 文章表:常用过滤字段
|
||
ALTER TABLE think_article ADD INDEX idx_category_id (category_id);
|
||
ALTER TABLE think_article ADD INDEX idx_status (status);
|
||
ALTER TABLE think_article ADD INDEX idx_tenant_id (tenant_id);
|
||
|
||
-- 日志表:按时间查询
|
||
ALTER TABLE think_login_log ADD INDEX idx_create_time (create_time);
|
||
ALTER TABLE think_operation_log ADD INDEX idx_create_time (create_time);
|
||
ALTER TABLE think_job_log ADD INDEX idx_job_id (job_id);
|
||
|
||
-- 菜单表:树形查询
|
||
ALTER TABLE think_menu ADD INDEX idx_parent_id (parent_id);
|
||
|
||
-- 字典项表:按字典 ID 查询
|
||
ALTER TABLE think_dict_item ADD INDEX idx_dict_id (dict_id);
|
||
ALTER TABLE think_config_item ADD INDEX idx_config_id (config_id);
|
||
|
||
-- 城市表:按编码查询
|
||
ALTER TABLE think_city ADD INDEX idx_area_code (area_code);
|
||
ALTER TABLE think_city ADD INDEX idx_parent_code (parent_code);
|
||
ALTER TABLE think_city ADD INDEX idx_pid (pid);
|
||
```
|
||
|
||
### 索引设计原则
|
||
|
||
| 原则 | 说明 |
|
||
|------|------|
|
||
| 外键必加 | 所有 `_id` 外键字段都应加索引 |
|
||
| 过滤字段 | `pageEqFields` 中配置的精确匹配字段应加索引 |
|
||
| 模糊搜索 | `pageLikeFields` 中的字段可考虑全文索引,但 LIKE '%xx%' 无法用普通索引 |
|
||
| 排序字段 | `pageOrderBy` 中的默认排序字段可加索引 |
|
||
| 时间字段 | 日志表的 `create_time` 必加索引(按时间范围查询) |
|
||
|
||
## 多数据库支持
|
||
|
||
### 支持的数据库
|
||
|
||
| 数据库 | type 值 | 默认端口 | 默认用户 | PHP 扩展 |
|
||
|--------|---------|----------|----------|----------|
|
||
| MySQL | `mysql` | 3306 | root | `pdo_mysql` |
|
||
| PostgreSQL | `pgsql` | 5432 | postgres | `pdo_pgsql` |
|
||
| SQL Server | `sqlsrv` | 1433 | sa | `pdo_sqlsrv` |
|
||
| Oracle | `oracle` | 1521 | - | `pdo_oci` |
|
||
| SQLite | `sqlite` | - | - | `pdo_sqlite` |
|
||
|
||
### 切换数据库
|
||
|
||
只需修改 `.env` 文件,无需改动任何代码:
|
||
|
||
::: code-group
|
||
|
||
```ini [MySQL(默认)]
|
||
[DATABASE]
|
||
TYPE = mysql
|
||
HOSTNAME = 127.0.0.1
|
||
DATABASE = rxthinkcmf.thinkphp8.naivevue
|
||
USERNAME = root
|
||
PASSWORD = root
|
||
HOSTPORT = 3306
|
||
```
|
||
|
||
```ini [PostgreSQL]
|
||
[DATABASE]
|
||
TYPE = pgsql
|
||
HOSTNAME = 127.0.0.1
|
||
DATABASE = rxthinkcmf.thinkphp8.naivevue
|
||
USERNAME = postgres
|
||
PASSWORD = root
|
||
HOSTPORT = 5432
|
||
```
|
||
|
||
```ini [SQL Server]
|
||
[DATABASE]
|
||
TYPE = sqlsrv
|
||
HOSTNAME = 127.0.0.1
|
||
DATABASE = rxthinkcmf.thinkphp8.naivevue
|
||
USERNAME = sa
|
||
PASSWORD = root
|
||
HOSTPORT = 1433
|
||
```
|
||
|
||
```ini [Oracle]
|
||
[DATABASE]
|
||
TYPE = oracle
|
||
HOSTNAME = 127.0.0.1
|
||
DATABASE = rxthinkcmf.thinkphp8.naivevue
|
||
USERNAME = root
|
||
PASSWORD = root
|
||
HOSTPORT = 1521
|
||
```
|
||
|
||
```ini [SQLite]
|
||
[DATABASE]
|
||
TYPE = sqlite
|
||
DATABASE = /www/api/runtime/database.sqlite
|
||
```
|
||
|
||
:::
|
||
|
||
### 配置文件结构
|
||
|
||
```php
|
||
// config/database.php
|
||
return [
|
||
'default' => env('database.type', 'mysql'),
|
||
'connections' => [
|
||
'mysql' => [...],
|
||
'pgsql' => [...],
|
||
'sqlsrv' => [...],
|
||
'oracle' => [...],
|
||
'sqlite' => [...],
|
||
],
|
||
];
|
||
```
|
||
|
||
### 字段类型映射
|
||
|
||
| 通用类型 | MySQL | PostgreSQL | SQL Server | Oracle | SQLite |
|
||
|---------|-------|------------|------------|--------|--------|
|
||
| 自增主键 | `INT AUTO_INCREMENT` | `SERIAL` | `INT IDENTITY` | `NUMBER` + 序列 | `INTEGER PRIMARY KEY` |
|
||
| 字符串 | `VARCHAR(n)` | `VARCHAR(n)` | `NVARCHAR(n)` | `VARCHAR2(n)` | `TEXT` |
|
||
| 文本 | `TEXT` | `TEXT` | `NVARCHAR(MAX)` | `CLOB` | `TEXT` |
|
||
| 布尔 | `TINYINT(1)` | `BOOLEAN` | `BIT` | `NUMBER(1)` | `INTEGER` |
|
||
| 日期时间 | `DATETIME` | `TIMESTAMP` | `DATETIME2` | `TIMESTAMP` | `TEXT` |
|
||
| 小数 | `DECIMAL(m,n)` | `NUMERIC(m,n)` | `DECIMAL(m,n)` | `NUMBER(m,n)` | `REAL` |
|
||
|
||
:::tip 业务代码零修改
|
||
ThinkPHP 的 ORM 层会自动处理大部分 SQL 差异,切换数据库只需修改 `.env` 中的 `DATABASE.TYPE`,业务代码无需任何修改。
|
||
:::
|
||
|
||
### 各数据库安装与配置
|
||
|
||
项目支持五种数据库,按需选择一种即可。
|
||
|
||
| 数据库 | 推荐场景 | 难度 | XAMPP 自带 | 说明 |
|
||
|--------|---------|------|-----------|------|
|
||
| **MySQL** | 日常开发、中小项目 | ⭐ 低 | ✅ 是 | 默认推荐,开箱即用 |
|
||
| **PostgreSQL** | 需要 JSONB、全文检索 | ⭐⭐ 中 | ❌ 否 | 功能丰富,需单独安装 |
|
||
| **SQLite** | 快速演示、单元测试 | ⭐ 低 | ✅ 是 | 无需数据库服务,零配置 |
|
||
| **SQL Server** | 企业 Windows 环境 | ⭐⭐ 中 | 驱动自带 | 需单独安装数据库服务 |
|
||
| **Oracle** | 大型企业项目 | ⭐⭐⭐ 高 | 驱动自带 | 需安装 Instant Client |
|
||
|
||
::: tip 新手推荐
|
||
XAMPP 已集成 MySQL 数据库服务,安装 XAMPP 后无需再单独安装数据库。
|
||
:::
|
||
|
||
#### MySQL 数据库
|
||
|
||
MySQL 是项目默认推荐的关系型数据库,XAMPP 已自带,开箱即用。
|
||
|
||
::: code-group
|
||
|
||
```sh [Windows]
|
||
# XAMPP 已自带 MySQL,无需额外安装
|
||
# 在 XAMPP 控制面板启动 MySQL 即可
|
||
|
||
# 确认扩展已启用(编辑 D:\xampp8.2\php\php.ini):
|
||
# extension=pdo_mysql
|
||
# 若前面有分号则去掉,保存后重启 XAMPP
|
||
|
||
# 创建数据库
|
||
D:\xampp8.2\mysql\bin\mysql.exe -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp8.naivevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
|
||
```
|
||
|
||
```sh [macOS]
|
||
brew install mysql
|
||
brew services start mysql
|
||
sudo mysql_secure_installation
|
||
|
||
# 创建数据库
|
||
mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp8.naivevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
|
||
```
|
||
|
||
```sh [Ubuntu / Debian]
|
||
sudo apt install mysql-server
|
||
sudo systemctl start mysql
|
||
sudo systemctl enable mysql
|
||
sudo mysql_secure_installation
|
||
|
||
# 创建数据库
|
||
mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp8.naivevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
|
||
```
|
||
|
||
```sh [Rocky Linux / CentOS]
|
||
sudo dnf install mysql-server
|
||
sudo systemctl start mysqld
|
||
sudo systemctl enable mysqld
|
||
sudo mysql_secure_installation
|
||
|
||
# 创建数据库
|
||
mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp8.naivevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
|
||
```
|
||
|
||
:::
|
||
|
||
#### PostgreSQL 数据库
|
||
|
||
PostgreSQL 功能强大,支持 JSONB、全文检索等高级特性,需单独安装。
|
||
|
||
::: code-group
|
||
|
||
```sh [Windows]
|
||
# 安装 PostgreSQL
|
||
# 访问 https://www.postgresql.org/download/windows/ 下载安装包
|
||
# 安装过程中记住设置的密码
|
||
|
||
# 确认扩展已启用(编辑 D:\xampp8.2\php\php.ini):
|
||
# extension=pdo_pgsql
|
||
# extension=pgsql
|
||
# 若前面有分号则去掉,保存后重启 XAMPP
|
||
|
||
# 设置 postgres 密码(首次)
|
||
psql -U postgres -c "ALTER USER postgres WITH PASSWORD 'root';"
|
||
|
||
# 创建数据库
|
||
psql -U postgres -c "CREATE DATABASE \"rxthinkcmf.thinkphp8.naivevue\" OWNER postgres ENCODING 'UTF8';"
|
||
```
|
||
|
||
```sh [macOS]
|
||
brew install postgresql
|
||
brew services start postgresql
|
||
|
||
# 设置 postgres 密码
|
||
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'root';"
|
||
|
||
# 创建数据库
|
||
sudo -u postgres psql -c "CREATE DATABASE \"rxthinkcmf.thinkphp8.naivevue\" OWNER postgres ENCODING 'UTF8';"
|
||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp8.naivevue\" TO postgres;"
|
||
```
|
||
|
||
```sh [Ubuntu / Debian]
|
||
sudo apt install postgresql postgresql-contrib
|
||
sudo systemctl start postgresql
|
||
|
||
# 设置 postgres 密码
|
||
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'root';"
|
||
|
||
# 创建数据库
|
||
sudo -u postgres psql -c "CREATE DATABASE \"rxthinkcmf.thinkphp8.naivevue\" OWNER postgres ENCODING 'UTF8';"
|
||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp8.naivevue\" TO postgres;"
|
||
```
|
||
|
||
```sh [Rocky Linux / CentOS]
|
||
sudo dnf install postgresql-server
|
||
sudo postgresql-setup --initdb
|
||
sudo systemctl start postgresql
|
||
|
||
# 设置 postgres 密码
|
||
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'root';"
|
||
|
||
# 创建数据库
|
||
sudo -u postgres psql -c "CREATE DATABASE \"rxthinkcmf.thinkphp8.naivevue\" OWNER postgres ENCODING 'UTF8';"
|
||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp8.naivevue\" TO postgres;"
|
||
```
|
||
|
||
:::
|
||
|
||
#### SQLite 数据库
|
||
|
||
SQLite 无需安装数据库服务器,数据存储在单个文件中,适合开发环境和小型项目。
|
||
|
||
::: code-group
|
||
|
||
```sh [Windows]
|
||
# XAMPP 已自带 SQLite 扩展,无需额外安装
|
||
# 只需创建数据库文件
|
||
mkdir D:\xampp\htdocs\runtime
|
||
echo. > D:\xampp\htdocs\runtime\database.sqlite
|
||
|
||
# 确认扩展已启用(编辑 D:\xampp8.2\php\php.ini):
|
||
# extension=pdo_sqlite
|
||
# extension=sqlite3
|
||
# 若前面有分号则去掉,保存后重启 XAMPP
|
||
|
||
# .env 配置
|
||
# DATABASE.TYPE = sqlite
|
||
# DATABASE.DATABASE = D:/xampp8.2/htdocs/runtime/database.sqlite
|
||
```
|
||
|
||
```sh [macOS]
|
||
brew install php sqlite
|
||
|
||
# 创建数据库文件
|
||
mkdir -p /www/api/runtime
|
||
touch /www/api/runtime/database.sqlite
|
||
```
|
||
|
||
```sh [Ubuntu / Debian]
|
||
sudo apt install php8.2-sqlite3
|
||
|
||
# 创建数据库文件
|
||
mkdir -p /www/api/runtime
|
||
touch /www/api/runtime/database.sqlite
|
||
```
|
||
|
||
```sh [Rocky Linux / CentOS]
|
||
sudo dnf install php-sqlite3
|
||
|
||
# 创建数据库文件
|
||
mkdir -p /www/api/runtime
|
||
touch /www/api/runtime/database.sqlite
|
||
```
|
||
|
||
:::
|
||
|
||
#### SQL Server 数据库
|
||
|
||
SQL Server 是微软商业数据库,XAMPP 已自带 pdo_sqlsrv 驱动,Windows 下开箱即用。
|
||
|
||
::: code-group
|
||
|
||
```sh [Windows]
|
||
# SQL Server 需单独安装(XAMPP 不自带数据库服务,但自带 PHP 驱动)
|
||
# 1. 下载安装 SQL Server Express:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
|
||
# 2. XAMPP 已自带 pdo_sqlsrv 扩展,在 php.ini 中启用:
|
||
# extension=php_sqlsrv_82_ts_x64.dll
|
||
# extension=php_pdo_sqlsrv_82_ts_x64.dll
|
||
|
||
# 创建数据库
|
||
sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp8.naivevue] COLLATE Chinese_PRC_CI_AS"
|
||
```
|
||
|
||
```sh [macOS]
|
||
# macOS 不原生支持 SQL Server,建议使用 Docker
|
||
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=root" \
|
||
-p 1433:1433 --name sqlserver \
|
||
-d mcr.microsoft.com/mssql/server:2022-latest
|
||
|
||
# 安装 PHP 扩展
|
||
pecl install pdo_sqlsrv
|
||
|
||
# 创建数据库
|
||
sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp8.naivevue] COLLATE Chinese_PRC_CI_AS"
|
||
```
|
||
|
||
```sh [Ubuntu / Debian]
|
||
# 1. 安装 SQL Server
|
||
curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
|
||
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list)"
|
||
sudo apt update
|
||
sudo apt install -y mssql-server
|
||
sudo /opt/mssql/bin/mssql-conf setup
|
||
|
||
# 2. 安装命令行工具
|
||
sudo apt install -y mssql-tools18
|
||
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
|
||
source ~/.bashrc
|
||
|
||
# 3. 安装 PHP 扩展
|
||
sudo pecl install pdo_sqlsrv
|
||
echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.2/mods-available/pdo_sqlsrv.ini
|
||
sudo phpenmod pdo_sqlsrv
|
||
|
||
# 创建数据库
|
||
sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp8.naivevue] COLLATE Chinese_PRC_CI_AS"
|
||
```
|
||
|
||
```sh [Rocky Linux / CentOS]
|
||
# 1. 安装 SQL Server
|
||
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo
|
||
sudo dnf install -y mssql-server
|
||
sudo /opt/mssql/bin/mssql-conf setup
|
||
|
||
# 2. 安装命令行工具
|
||
sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo
|
||
sudo dnf install -y mssql-tools18
|
||
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
|
||
source ~/.bashrc
|
||
|
||
# 3. 安装 PHP 扩展
|
||
sudo pecl install pdo_sqlsrv
|
||
echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php.d/pdo_sqlsrv.ini
|
||
|
||
# 创建数据库
|
||
sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp8.naivevue] COLLATE Chinese_PRC_CI_AS"
|
||
```
|
||
|
||
:::
|
||
|
||
#### Oracle 数据库
|
||
|
||
Oracle 是企业级商业数据库,需手动安装 Instant Client 和 pdo_oci 扩展。
|
||
|
||
::: code-group
|
||
|
||
```sh [Windows]
|
||
# XAMPP 已自带 php_pdo_oci.dll,只需安装 Oracle Instant Client 并在 php.ini 中启用
|
||
|
||
# 1. 安装 Oracle Instant Client
|
||
# 下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
|
||
# 选择 Basic Package,x64,推荐 19c
|
||
# 解压到 C:\oracle\instantclient_19_20(⚠️ 避免空格与中文)
|
||
|
||
# 2. 配置系统环境变量
|
||
# 将 C:\oracle\instantclient_19_20 添加到系统 PATH
|
||
|
||
# 3. 安装 VC++ 运行库(必装)
|
||
# 下载:https://aka.ms/vc14/vc_redist.x64.exe
|
||
|
||
# 4. 启用扩展
|
||
# 编辑 D:\xampp8.2\php\php.ini,去掉分号:
|
||
# extension=pdo_oci
|
||
|
||
# 5. 重启 XAMPP(完全关闭再启动)
|
||
|
||
# .env 配置
|
||
# DATABASE.TYPE = oracle
|
||
# DATABASE.HOSTNAME = 127.0.0.1
|
||
# DATABASE.DATABASE = rxthinkcmf.thinkphp8.naivevue
|
||
# DATABASE.USERNAME = root
|
||
# DATABASE.PASSWORD = root
|
||
# DATABASE.HOSTPORT = 1521
|
||
```
|
||
|
||
```sh [macOS]
|
||
# Oracle 不原生支持 macOS,建议使用 Docker
|
||
docker run -d --name oracle-xe -p 1521:1521 \
|
||
-e ORACLE_PWD=root \
|
||
gvenzl/oracle-xe:21-slim
|
||
|
||
# 安装 PHP 扩展
|
||
pecl install pdo_oci
|
||
```
|
||
|
||
```sh [Ubuntu / Debian]
|
||
# 1. 安装 Oracle Database
|
||
sudo dpkg -i oracle-database-xe-21c-1.0-1.x86_64.deb
|
||
sudo /etc/init.d/oracle-xe-21c configure
|
||
|
||
# 2. 安装 Oracle Instant Client
|
||
sudo dpkg -i oracle-instantclient-basic-*.deb
|
||
sudo dpkg -i oracle-instantclient-devel-*.deb
|
||
|
||
# 3. 安装 PHP 扩展
|
||
sudo pecl install pdo_oci
|
||
echo "extension=pdo_oci.so" | sudo tee /etc/php/8.2/mods-available/pdo_oci.ini
|
||
sudo phpenmod pdo_oci
|
||
|
||
# 4. 创建表空间和用户
|
||
sqlplus system/root@localhost:1521/XE <<EOF
|
||
CREATE TABLESPACE "rxthinkcmf_thinkphp8_naivevue" DATAFILE '/opt/oracle/oradata/XE/rxthinkcmf_thinkphp8_naivevue.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M;
|
||
CREATE USER "root" IDENTIFIED BY "root" DEFAULT TABLESPACE "rxthinkcmf_thinkphp8_naivevue";
|
||
GRANT CONNECT, RESOURCE, CREATE VIEW TO "root";
|
||
GRANT UNLIMITED TABLESPACE TO "root";
|
||
EXIT;
|
||
EOF
|
||
```
|
||
|
||
```sh [Rocky Linux / CentOS]
|
||
# 1. 安装 Oracle Database
|
||
sudo rpm -ivh oracle-database-xe-21c-1.0-1.x86_64.rpm
|
||
sudo /etc/init.d/oracle-xe-21c configure
|
||
|
||
# 2. 安装 Oracle Instant Client
|
||
sudo rpm -ivh oracle-instantclient-basic-*.rpm
|
||
sudo rpm -ivh oracle-instantclient-devel-*.rpm
|
||
|
||
# 3. 安装 PHP 扩展
|
||
sudo pecl install pdo_oci
|
||
echo "extension=pdo_oci.so" | sudo tee /etc/php/8.2/mods-available/pdo_oci.ini
|
||
sudo phpenmod pdo_oci
|
||
|
||
# 4. 创建表空间和用户
|
||
sqlplus system/root@localhost:1521/XE <<EOF
|
||
CREATE TABLESPACE "rxthinkcmf_thinkphp8_naivevue" DATAFILE '/opt/oracle/oradata/XE/rxthinkcmf_thinkphp8_naivevue.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M;
|
||
CREATE USER "root" IDENTIFIED BY "root" DEFAULT TABLESPACE "rxthinkcmf_thinkphp8_naivevue";
|
||
GRANT CONNECT, RESOURCE, CREATE VIEW TO "root";
|
||
GRANT UNLIMITED TABLESPACE TO "root";
|
||
EXIT;
|
||
EOF
|
||
```
|
||
|
||
:::
|
||
|
||
## SQL 脚本
|
||
|
||
项目为每种数据库提供了独立的 SQL 脚本,存放在 `document/` 目录下按数据库类型分组:
|
||
|
||
```text
|
||
document/
|
||
├── mysql/
|
||
│ └── rxthinkcmf.thinkphp8.naivevue.sql # MySQL 版本
|
||
├── postgresql/
|
||
│ └── rxthinkcmf.thinkphp8.naivevue.sql # PostgreSQL 版本
|
||
├── sqlserver/
|
||
│ └── rxthinkcmf.thinkphp8.naivevue.sql # SQL Server 版本
|
||
├── oracle/
|
||
│ └── rxthinkcmf.thinkphp8.naivevue.sql # Oracle 版本
|
||
└── sqlite/
|
||
└── rxthinkcmf.thinkphp8.naivevue.sql # SQLite 版本
|
||
```
|
||
|
||
各数据库脚本包含完整的表结构定义和初始数据(用户、角色、菜单、字典、城市行政区划等),已针对各数据库的 SQL 语法做了适配,可直接导入使用。
|
||
|
||
导入方法详见 [2.4 数据库初始化](/zh/quickstart/database-init.html)。
|
||
|
||
## 慢查询排查
|
||
|
||
```ini
|
||
# MySQL my.cnf
|
||
slow_query_log = 1
|
||
slow_query_log_file = /var/log/mysql/slow.log
|
||
long_query_time = 2
|
||
```
|
||
|
||
:::warning 注意
|
||
项目所有查询都通过 ThinkPHP ORM 构建,不会出现原生 SQL 注入。如需排查慢查询,建议开启数据库慢查询日志,而非在代码层面埋点。
|
||
:::
|