Files
rxthinkcmf-wiki/RXThinkCMF_ThinkPhp8_EleVue/zh/architecture/database-design.md
T
2026-09-29 10:14:04 +08:00

750 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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=菜单 2=按钮 |
| `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.thinkphp6.elevue
USERNAME = root
PASSWORD = root
HOSTPORT = 3306
```
```ini [PostgreSQL]
[DATABASE]
TYPE = pgsql
HOSTNAME = 127.0.0.1
DATABASE = rxthinkcmf.thinkphp6.elevue
USERNAME = postgres
PASSWORD = root
HOSTPORT = 5432
```
```ini [SQL Server]
[DATABASE]
TYPE = sqlsrv
HOSTNAME = 127.0.0.1
DATABASE = rxthinkcmf.thinkphp6.elevue
USERNAME = sa
PASSWORD = root
HOSTPORT = 1433
```
```ini [Oracle]
[DATABASE]
TYPE = oracle
HOSTNAME = 127.0.0.1
DATABASE = rxthinkcmf.thinkphp6.elevue
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.thinkphp6.elevue` 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.thinkphp6.elevue` 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.thinkphp6.elevue` 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.thinkphp6.elevue` 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.thinkphp6.elevue\" 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.thinkphp6.elevue\" OWNER postgres ENCODING 'UTF8';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp6.elevue\" 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.thinkphp6.elevue\" OWNER postgres ENCODING 'UTF8';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp6.elevue\" 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.thinkphp6.elevue\" OWNER postgres ENCODING 'UTF8';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp6.elevue\" 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.thinkphp6.elevue] 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.thinkphp6.elevue] 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.thinkphp6.elevue] 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.thinkphp6.elevue] 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.thinkphp6.elevue
# 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_thinkphp6_elevue" DATAFILE '/opt/oracle/oradata/XE/rxthinkcmf_thinkphp6_elevue.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M;
CREATE USER "root" IDENTIFIED BY "root" DEFAULT TABLESPACE "rxthinkcmf_thinkphp6_elevue";
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_thinkphp6_elevue" DATAFILE '/opt/oracle/oradata/XE/rxthinkcmf_thinkphp6_elevue.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M;
CREATE USER "root" IDENTIFIED BY "root" DEFAULT TABLESPACE "rxthinkcmf_thinkphp6_elevue";
GRANT CONNECT, RESOURCE, CREATE VIEW TO "root";
GRANT UNLIMITED TABLESPACE TO "root";
EXIT;
EOF
```
:::
## SQL 脚本
项目为每种数据库提供了独立的 SQL 脚本,存放在 `document/` 目录下按数据库类型分组:
```text
document/
├── mysql/
│ └── rxthinkcmf.thinkphp6.elevue.sql # MySQL 版本
├── postgresql/
│ └── rxthinkcmf.thinkphp6.elevue.sql # PostgreSQL 版本
├── sqlserver/
│ └── rxthinkcmf.thinkphp6.elevue.sql # SQL Server 版本
├── oracle/
│ └── rxthinkcmf.thinkphp6.elevue.sql # Oracle 版本
└── sqlite/
└── rxthinkcmf.thinkphp6.elevue.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 注入。如需排查慢查询,建议开启数据库慢查询日志,而非在代码层面埋点。
:::