## 数据库
很多时候我们的FastAdmin插件都需要使用到数据库,此篇幅为你解答如何在FastAdmin插件中使用数据库功能。
## 设计规范
我们在设计插件数据库时建议统一设计规范,因为更好的设计规范能更好的让我们的用户更快速的掌握我们开发者的设计思想。
1. 表名和字段名全小写,只允许出现`a-z`和`_`这几种字符,且不能有拼音,只能为英文单词\
2. 存储引擎统一使用`innodb`引擎
3. 字符集统一使用`utf8mb4`,排序规则使用`utf8mb4_general_ci`
4. 关联字段统一使用`_id`结尾,如`user_id`、`task_id`(任务表名为task),`item_id`(物品表名为item), 当为`father_id`、`parent_id`、`pid`、`prev_id`等字段时表示和当前表主键进行关联,当为`task_ids`、`user_ids`时表示一个集合,以半角逗号进行分隔(非JSON)
5. 时间统一使用`Unix时间戳`格式, 秒级, 长整型, 长度16,且必须以`time`结尾, 如`createtime`、`updatetime`,`paytime`、`expiretime`等
6. 时长统一使用秒格式, 整型, 长度10,且必须以`seconds`结尾,如`onlineseconds`、`todayonlineseconds`等
7. 表主键必须为`id`,主索引
8. 表名和字段名统一使用英文名称,不允许出现中英混搭的情况出现
9. 日志表统一为模块名加上`_log`进行命名
10. 字段内容为`json`数据时,以`data`进行结尾,比如`itemdata`、`rewarddata`
11. 当字段为某操作数量时,以`nums`结尾,比如`buynums`、`salenums`
12. 当一表出现两个或两个以上会员ID时,`user_id`表示自己,`receiver_user_id`表示他人,多人时使用`receiver_user_ids`,以半角逗号进行分隔(非JSON)
13. 当出现可数名词字段时,一定要加上字符`s`,如`comments`、`views`等
14. 数据表添加的索引对应的字段长度不建议超过100
## 配置文件
在插件目录`addons/mydemo`目录添加一个`install.sql`,然后将安装脚本的SQL存放在此文件中。
## 数据表名规范
插件数据表名必须以`插件标识`开始,例如:
~~~markdown
__PREFIX__mydemo_log
__PREFIX__mydemo_item
__PREFIX__mydemo_comment
~~~
其中`mydemo`为你的插件标识,`__PREFIX__`为数据表前缀。
## 特殊字段
建议开发者在设计数据库时保留以下字段的设计名称,这样我们能更好的统一不同插件之间的命名规范。
| 字段 | 字段名称 | 字段类型 | 字段说明 |
| --- | --- | --- | --- |
| category\_id | 分类ID | int | 关联`fa_category`表,后台CRUD时会自动生成selectpage组件 |
| user\_id | 会员ID | int | 关联`fa_user`表,后台CRUD时会自动生成selectpage组件 |
| weigh | 权重 | int | 后台的排序字段,如果存在该字段将出现排序按钮,可上下拖动进行排序 |
| createtime | 创建时间 | bigint | 记录添加时间字段,不需要手动维护 |
| updatetime | 更新时间 | bigint | 记录更新时间的字段,不需要手动维护 |
| deletetime | 删除时间 | bigint | 记录删除时间的字段,不需要手动维护,如果存在此字段将会生成回收站功能,字段默认值务必为null |
| status | 状态字段 | enum | 状态标识,如果存在此字段将启用TAB选项卡展示列表 |
## 安装脚本
每个插件都可以自带一个`install.sql`,路径位于`addons/mydemo/install.sql`,用于在插件安装时,FastAdmin插件系统会自动执行此文件中的SQL,可用于创建数据库,写入相关数据等操作。以下为示例的SQL:
~~~sql
CREATE TABLE IF NOT EXISTS `__PREFIX__mydemo_list` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`pid` int(10) DEFAULT NULL COMMENT '父id',
`title` varchar(100) DEFAULT NULL COMMENT '标题',
`name` varchar(100) DEFAULT NULL COMMENT '名称',
`createtime` bigint(16) DEFAULT NULL COMMENT '创建时间',
`updatetime` bigint(16) DEFAULT NULL COMMENT '更新时间',
`publishtime` bigint(16) DEFAULT NULL COMMENT '发布时间',
`deletetime` bigint(16) DEFAULT NULL COMMENT '删除时间',
`memo` varchar(100) DEFAULT '' COMMENT '备注',
`status` enum('normal','hidden','rejected','pulloff') NOT NULL DEFAULT 'normal' COMMENT '状态',
PRIMARY KEY (`id`),
KEY `pid` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='示例表';
~~~
`__PREFIX__`用于将在执行导入时自动替换为用户数据库配置的表前缀。
如果在版本升级时插件表结构需要变更,需要在`install.sql`追加变更的SQL语句,如
~~~sql
--
-- 1.0.1
-- 添加名称字段name
--
ALTER TABLE `__PREFIX__mydemo_list` ADD COLUMN `name` varchar(255) NULL DEFAULT '' COMMENT '名称' AFTER `title`;
~~~
同时注意上方的`CREATE TABLE IF NOT EXISTS __PREFIX__mydemo_list`语句中字段`name`的创建也需要存在。
## 测试数据
每个插件可自带一个`testdata.sql`,用于安装插件成功后导入测试数据,具体文档请参考测试数据
章节。
## 温馨提示
1.**不允许修改框架自带的数据表结构或其它应用插件的数据表结构**。
2. 安装脚本中不能包含`DROP TABLE`删除表和`DELETE FROM`删除记录的语句。
3. 如果需要测试数据,请参考`测试数据`章节
4. 日期时间如使用时间戳,请使用`bigint(16)`类型,且设置默认为`NULL`