--- title: "00-数据库表关系" created: 2025-12-09 aliases: - 数据库表关系 tags: - 项目 --- # 数据库表关系 ## 视频 ![[image-3c4c7af4.png]] ## 设计思路与核心细节 项目并非简单的 CRUD 堆砌,而是典型的“高并发微服务架构”**下的数据库设计范本。其设计核心在于**性能优先、数据隔离、以及对分库分表场景的深度适配。 ### 一、 核心设计思路 (Macro Design Strategy) #### 1. 垂直拆分:一服务一库 (Microservice Isolation) - **思路**:遵循微服务架构原则,数据的所有权归属于特定的服务。 - **落地**: - 用户服务 -> `damai_user` 库 - 节目服务 -> `damai_program` 库 - 订单服务 -> `damai_order` 库 - 支付服务 -> `damai_pay` 库 - **价值**:避免跨服务直接连库查询(这是微服务大忌),强制通过 RPC 接口调用,降低耦合度。 #### 2. 水平拆分:分库分表 (Sharding Strategy) - **思路**:针对数据量极大的表(如订单、用户),单表无法承载海量数据,必须进行水平切分。 - **落地**:项目采用了“2库 x 4表”的策略(如 `damai_order_0`, `damai_order_1`)。 - **关键点**:学习时不需要分出 32 个库这么夸张,只要配置好了 ShardingSphere,从 2 个库扩展到 16 个库只是修改配置文件的分片规则而已,核心是[[01-为什么掌握分片原理就能很容易实现分库分表?|为什么掌握分片原理就能很容易实现分库分表?]]。 #### 3. 读写分离与反范式设计 (Denormalization) - **思路**:为了应对高并发查询,**牺牲空间换时间**,打破数据库范式(3NF),进行适当的数据冗余。 - **落地(典型案例)**:**订单表 (**`d_order`**) 冗余了大量节目信息**。 - **现象**:`d_order` 表中不仅存了 `program_id`,还存了 `program_title` (标题)、`program_place` (地点)、`program_show_time` (演出时间) 等。 - **原因**:用户查看订单列表是高频操作。如果不冗余,查询订单时必须远程调用节目服务(RPC)或跨库 Join,这将导致严重的性能瓶颈。冗余后,单表查询即可出结果,效率极高。 ### 二、 极具价值的处理细节 (Implementation Details) #### 1. 解决分库分表后的“读扩散”问题 - **痛点**:用户表按 `user_id` 分片。但用户登录时,往往是用 **手机号** 或 **邮箱** 登录,此时不知道 `user_id`,就不知道去哪个分片查,会导致全库扫描(读扩散)。 - **神来之笔**:设计了 `d_user_mobile` (手机号表) 和 `d_user_email` (邮箱表)。 - 这两张表不做分片(或按手机号分片),专门用来建立 `手机号 -> user_id` 的映射。 - **流程**:登录 -> 查手机表拿到 ID -> 根据 ID 路由到具体的分片查用户详情。 #### 2. 字段设计的“基建标准” - **强制字段**:每张表必须包含 `id` (主键)、`create_time` (创建时间)、`edit_time` (编辑时间)、`status` (逻辑删除/状态)。这是企业级开发的硬性规范,用于审计和数据追踪。 - **枚举映射注释**:在 SQL 建表语句的 `COMMENT` 中,明确写出状态码的含义(如 `1:未支付 2:已取消`)。这比单独的文档更有效,能防止代码中的枚举定义与数据库状态不一致。 #### 3. 安全与渠道隔离 - **敏感数据加密**:用户表中的 `id_number` (身份证)、`mobile`、`address` 等隐私字段,在入库前全部加密存储,防止脱库泄露。 - **渠道隔离 (**`d_channel_data`**)**:针对 PC、小程序、APP 等不同端,分配不同的 `code` 和 `密钥对` (RSA/AES)。这意味着不同端的请求参数加密方式不同,极大提高了接口被爬虫破解的门槛。 #### 4. 层次化的节目数据结构 - 节目数据设计得非常细致,分为四层结构,支撑了复杂的选座业务: 1. **节目 (Program)**:如“周杰伦演唱会”。 2. **场次 (ShowTime)**:如“5月20日场”、“5月21日场”。 3. **票档 (TicketCategory)**:如“内场1280元”、“看台580元”。 4. **座位 (Seat)**:具体的排号、座号,关联到票档。 ### 三、 如何学会和使用这些设计? #### 1. 逆向思维训练(不要只看,要画) - **练习方法**:在看视频前,先自己构思:“如果让我设计一个支持选座的订单表,我会怎么设计?” - **对比复盘**:然后看视频,你会发现自己可能漏掉了“冗余节目名称”或者“手机号映射表”。这种**“我以为VS实际是”**的冲击,能让你对架构设计的理解最深刻。 #### 2. 关注“反常”之处 - 当你看到数据库里有看起来“重复”或“多余”的设计时(比如单独的手机号表,或者订单里存了图片地址),不要觉得是作者乱写。 - **思考逻辑**:问自己“在高并发下,如果不这么做会怎样?”。通常这些“反常”都是为了**性能**(减少 Join)或**扩展性**(分库分表路由)做的妥协。 #### 3. 落地到你的项目 - **枚举管理**:学习项目中将数据库 `tinyint` 状态字段与 Java `Enum` 严格对应的做法。 - **基类抽取**:在你的代码中,将 `create_time`, `update_time`, `id` 抽取为 `BaseEntity`,利用 MyBatis Plus 的自动填充功能处理,不要每次手动 set 时间。 - **敏感数据**:模仿项目中的加密逻辑,在 Service 层切面或工具类中统一处理手机号等敏感信息的加密解密。 通过理解这些表结构背后的**业务场景(高并发读写)和技术限制(分库分表路由)**,你不仅能学会这个项目,还能具备设计中大型系统数据库的能力。 ## 基础数据服务 `d_channel_data` ```sql CREATE TABLE `d_channel_data` ( `id` bigint(64) NOT NULL COMMENT 'id', `name` varchar(50) DEFAULT NULL COMMENT '名称', `code` varchar(50) NOT NULL COMMENT '编码', `introduce` varchar(500) DEFAULT NULL COMMENT '介绍描述', `sign_public_key` text NOT NULL COMMENT 'rsa签名公钥', `sign_secret_key` text NOT NULL COMMENT 'rsa签名秘钥', `aes_key` text COMMENT 'aes秘钥', `data_public_key` text COMMENT 'rsa参数公钥', `data_secret_key` text COMMENT 'rsa参数私钥', `token_secret` text NOT NULL COMMENT 'token秘钥', `status` int(1) DEFAULT '1' COMMENT '状态 1:启用 0:禁用', `edit_time` datetime DEFAULT NULL COMMENT '编辑时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `code_IDX` (`code`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='渠道基础数据信息'; ``` `d_area` ```sql CREATE TABLE `d_area` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '区域id', `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父区域id', `name` varchar(120) NOT NULL COMMENT '区域名字', `type` int(11) NOT NULL DEFAULT '2' COMMENT '1:省 2:区 3:县', `municipality` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1:是 0:否', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `edit_time` datetime DEFAULT NULL COMMENT '编辑时间', `status` tinyint(1) DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`), KEY `ctype` (`type`) ) ENGINE=InnoDB AUTO_INCREMENT=3409 DEFAULT CHARSET=utf8 COMMENT='地区表'; ``` ### 表关系 ![[image-bdae0adb.webp]] ## 用户服务 `d_user 用户表` ```sql CREATE TABLE `d_user` ( `id` bigint(20) NOT NULL COMMENT '主键id', `name` varchar(256) DEFAULT NULL COMMENT '用户名字', `rel_name` varchar(256) DEFAULT NULL COMMENT '用户真实名字', `mobile` varchar(512) NOT NULL COMMENT '手机号', `gender` int(11) NOT NULL DEFAULT '1' COMMENT '1:男 2:女', `password` varchar(512) DEFAULT NULL COMMENT '密码', `email_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否邮箱认证 1:已验证 0:未验证', `email` varchar(256) DEFAULT NULL COMMENT '邮箱地址', `rel_authentication_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否实名认证 1:已验证 0:未验证', `id_number` varchar(512) DEFAULT NULL COMMENT '身份证号码', `address` varchar(256) DEFAULT NULL COMMENT '收货地址', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `edit_time` datetime DEFAULT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; ``` `d_user_mobile 用户手机表` ```sql CREATE TABLE `d_user_mobile` ( `id` bigint(20) NOT NULL COMMENT '主键id', `user_id` bigint(20) NOT NULL COMMENT '用户id', `mobile` varchar(512) NOT NULL COMMENT '手机号', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户手机表'; ``` `d_user_email 用户邮箱表` ```sql CREATE TABLE `d_user_email` ( `id` bigint(20) NOT NULL COMMENT '主键id', `user_id` bigint(20) NOT NULL COMMENT '用户id', `email` varchar(512) NOT NULL COMMENT '邮箱', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户邮箱表'; ``` `d_ticket_user 购票人表` ```sql CREATE TABLE `d_ticket_user` ( `id` bigint(20) NOT NULL COMMENT '主键id', `user_id` bigint(20) NOT NULL COMMENT '用户id', `rel_name` varchar(256) NOT NULL COMMENT '用户真实名字', `id_type` int(11) NOT NULL DEFAULT '1' COMMENT '证件类型 1:身份证 2:港澳台居民居住证 3:港澳居民来往内地通行证 4:台湾居民来往内地通行证 5:护照 6:外国人永久居住证', `id_number` varchar(512) NOT NULL COMMENT '证件号码', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购票人表'; ``` 注意 单独设计出 d\_user\_mobile 用户手机表 和 d\_user\_email 用户邮箱表 是因为用户登录时,可以使用手机号或者邮箱登录,而用户表在分库分表时,选择的分片键是用户id,所以要设计出这两张表,根据手机号或者邮箱查询到用户id,然后使用用户id查询用户信息 ### 表关系 ![[image-004e439f.webp]] ## 节目服务 `d_program 节目表` ```sql CREATE TABLE `d_program` ( `id` bigint(20) NOT NULL COMMENT '主键id', `program_group_id` bigint(20) NOT NULL COMMENT '节目分组id', `prime` tinyint(1) NOT NULL DEFAULT '1' COMMENT '当属于同一个节目分组时 是否为主要节目 0:否 1:是', `area_id` bigint(20) NOT NULL COMMENT '所在区域id', `program_category_id` bigint(20) NOT NULL COMMENT '节目类型表id', `parent_program_category_id` bigint(20) NOT NULL COMMENT '父节目类型表id', `title` varchar(512) NOT NULL COMMENT '标题', `actor` varchar(256) DEFAULT NULL COMMENT '艺人', `place` varchar(100) DEFAULT NULL COMMENT '地点', `item_picture` text COMMENT '项目图片', `pre_sell` tinyint(1) NOT NULL DEFAULT '1' COMMENT '预售 1:是 0:否', `pre_sell_instruction` varchar(256) DEFAULT NULL COMMENT '预售说明', `important_notice` varchar(100) DEFAULT NULL COMMENT '重要通知', `detail` text NOT NULL COMMENT '项目详情', `per_order_limit_purchase_count` int(11) DEFAULT '6' COMMENT '每笔订单最多购买数量', `per_account_limit_purchase_count` int(11) DEFAULT '6' COMMENT '每个账号最多购买数量', `refund_ticket_rule` varchar(512) DEFAULT NULL COMMENT '退票/换票规则', `delivery_instruction` varchar(512) DEFAULT NULL COMMENT '配送信息说明', `entry_rule` varchar(512) DEFAULT NULL COMMENT '入场规则', `child_purchase` varchar(512) DEFAULT NULL COMMENT '儿童购票', `invoice_specification` varchar(512) DEFAULT NULL COMMENT '发票说明', `real_ticket_purchase_rule` text COMMENT '实名购票规则', `abnormal_order_description` text COMMENT '异常排单说明', `kind_reminder` text COMMENT '温馨提示', `performance_duration` varchar(100) DEFAULT NULL COMMENT '演出时长', `entry_time` varchar(512) DEFAULT NULL COMMENT '入场时间', `min_performance_count` int(11) DEFAULT NULL COMMENT '最低演出曲目', `main_actor` varchar(100) DEFAULT NULL COMMENT '主要演员', `min_performance_duration` varchar(100) DEFAULT NULL COMMENT '最低演出时长', `prohibited_item` text COMMENT '禁止携带物品', `deposit_specification` varchar(512) DEFAULT NULL COMMENT '寄存说明', `total_count` bigint(20) DEFAULT NULL COMMENT '大麦网初始开售时全场可售门票总张数', `permit_refund` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许退款 0:不支持退 1:条件退 2:全部退', `refund_explain` varchar(512) DEFAULT NULL COMMENT '退款说明', `rel_name_ticket_entrance` tinyint(1) NOT NULL DEFAULT '0' COMMENT '实名制购票和入场 1:是 0:否', `rel_name_ticket_entrance_explain` varchar(512) DEFAULT NULL COMMENT '实名制购票和入场说明', `permit_choose_seat` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许选座 1:允许选座 0:不允许选座', `choose_seat_explain` varchar(512) DEFAULT NULL COMMENT '选座说明', `electronic_delivery_ticket` tinyint(1) NOT NULL DEFAULT '1' COMMENT '电子票/快递票 0:都没有1:电子票 2:快递票', `electronic_delivery_ticket_explain` varchar(512) DEFAULT NULL COMMENT '电子票说明', `electronic_invoice` tinyint(1) NOT NULL DEFAULT '1' COMMENT '电子发票 1:是 0:不是', `electronic_invoice_explain` varchar(512) DEFAULT NULL COMMENT '电子发票说明', `high_heat` tinyint(1) NOT NULL DEFAULT '0' COMMENT '高热度节目 0:否 1:是', `program_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '节目状态 1:上架 0:下架', `issue_time` datetime DEFAULT NULL COMMENT '上架发行时间', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`), KEY `program_group_id_idx` (`program_group_id`) USING BTREE, KEY `issue_time_idx` (`issue_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节目表'; ``` `d_program_group 节目分组表` ```sql CREATE TABLE `d_program_group` ( `id` bigint(20) NOT NULL COMMENT '主键id', `program_json` text COMMENT '节目json', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节目分组表'; ``` `d_program_category 节目类型表` ```sql CREATE TABLE `d_program_category` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父id', `name` varchar(120) NOT NULL COMMENT '名字', `type` int(11) NOT NULL DEFAULT '2' COMMENT '1:一级种类 2:二级种类', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`), UNIQUE KEY `parent_id_name_type_idx` (`parent_id`,`name`,`type`) USING BTREE, KEY `parent_id` (`parent_id`), KEY `ctype` (`type`) ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 COMMENT='节目类型表'; ``` `d_program_show_time 节目演出时间表` ```sql CREATE TABLE `d_program_show_time` ( `id` bigint(20) NOT NULL COMMENT '主键id', `program_id` bigint(20) NOT NULL COMMENT '节目表id', `show_time` datetime NOT NULL COMMENT '演出时间', `show_day_time` datetime DEFAULT NULL COMMENT '演出时间(精确到天)', `show_week_time` varchar(64) NOT NULL COMMENT '演出时间所在的星期', `area_id` bigint(20) DEFAULT NULL COMMENT '地区id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `edit_time` datetime DEFAULT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`), KEY `program_id_idx` (`program_id`) USING BTREE, KEY `show_time_idx` (`show_time`) USING BTREE, KEY `show_day_time_idx` (`show_day_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节目演出时间表'; ``` `d_ticket_category 节目票档表` ```sql CREATE TABLE `d_ticket_category` ( `id` bigint(20) NOT NULL COMMENT '主键id', `program_id` bigint(20) NOT NULL COMMENT '节目表id', `introduce` varchar(256) NOT NULL COMMENT '介绍', `price` decimal(10,0) NOT NULL COMMENT '价格', `total_number` bigint(20) NOT NULL COMMENT '总数量', `remain_number` bigint(20) NOT NULL COMMENT '剩余数量', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节目票档表'; ``` `d_seat` ```sql CREATE TABLE `d_seat` ( `id` bigint(20) NOT NULL COMMENT '主键id', `program_id` bigint(20) NOT NULL COMMENT '节目表id', `ticket_category_id` bigint(20) NOT NULL COMMENT '节目票档id', `row_code` int(11) NOT NULL COMMENT '排号', `col_code` int(11) NOT NULL COMMENT '列号', `seat_type` int(3) NOT NULL COMMENT '座位类型 详见seatType枚举', `price` decimal(10,0) NOT NULL COMMENT '座位价格', `sell_status` int(3) NOT NULL DEFAULT '1' COMMENT '1未售卖 2锁定 3已售卖', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '编辑时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`), KEY `program_id_idx` (`program_id`) USING BTREE, KEY `row_code_idx` (`row_code`) USING BTREE, KEY `col_code_idx` (`col_code`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='座位表'; ``` ### 表关系 ![[image-87456bad.webp]] ## 订单服务 `d_order` ```sql CREATE TABLE `d_order` ( `id` bigint NOT NULL COMMENT '主键id', `order_number` bigint NOT NULL COMMENT '订单编号', `identifier_id` bigint DEFAULT NULL COMMENT '记录id', `program_id` bigint NOT NULL COMMENT '节目表id', `program_item_picture` varchar(1024) DEFAULT NULL COMMENT '节目图片介绍', `user_id` bigint NOT NULL COMMENT '用户id', `program_title` varchar(512) DEFAULT NULL COMMENT '节目标题', `program_place` varchar(100) DEFAULT NULL COMMENT '节目地点', `program_show_time` datetime DEFAULT NULL COMMENT '节目演出时间', `program_permit_choose_seat` tinyint(1) NOT NULL COMMENT '节目是否允许选座 1:允许选座 0:不允许选座', `distribution_mode` varchar(256) DEFAULT NULL COMMENT '配送方式', `take_ticket_mode` varchar(256) DEFAULT NULL COMMENT '取票方式', `order_price` decimal(10,0) DEFAULT NULL COMMENT '订单价格', `pay_order_type` int DEFAULT NULL COMMENT '支付订单方式', `order_status` int DEFAULT '1' COMMENT '订单状态 1:未支付 2:已取消 3:已支付 4:已退单', `reconciliation_status` int DEFAULT '1' COMMENT '对账状态 1:未对账 -1:对账完成有问题 2:对账完成没有问题 3:对账有问题处理完毕', `order_version` int NOT NULL DEFAULT '1' COMMENT '创建订单的版本', `create_order_time` datetime DEFAULT NULL COMMENT '生成订单时间', `cancel_order_time` datetime DEFAULT NULL COMMENT '取消订单时间', `pay_order_time` datetime DEFAULT NULL COMMENT '支付订单时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `edit_time` datetime DEFAULT NULL COMMENT '编辑时间', `status` tinyint(1) DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`), UNIQUE KEY `d_order_order_number_IDX` (`order_number`) USING BTREE, KEY `user_id_IDX` (`user_id`) USING BTREE, KEY `program_id_IDX` (`program_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='订单表'; ``` `d_order_ticket_user` ```sql CREATE TABLE `d_order_ticket_user` ( `id` bigint NOT NULL COMMENT '主键id', `order_number` bigint NOT NULL COMMENT '订单编号', `program_id` bigint NOT NULL COMMENT '节目表id', `user_id` bigint NOT NULL COMMENT '用户id', `ticket_user_id` bigint NOT NULL COMMENT '购票人id', `seat_id` bigint NOT NULL COMMENT '座位id', `seat_info` varchar(100) DEFAULT NULL COMMENT '座位信息', `ticket_category_id` bigint DEFAULT NULL COMMENT '节目票档id', `order_price` decimal(10,0) DEFAULT NULL COMMENT '订单价格', `pay_order_price` decimal(10,0) DEFAULT NULL COMMENT '支付订单价格', `pay_order_type` int DEFAULT NULL COMMENT '支付订单方式', `order_status` int DEFAULT '1' COMMENT '订单状态 1:未支付 2:已取消 3:已支付 4:已退单', `reconciliation_status` int DEFAULT '1' COMMENT '对账状态 1:未对账 -1:对账完成有问题 2:对账完成没有问题 3:对账有问题处理完毕', `create_order_time` datetime DEFAULT NULL COMMENT '生成订单时间', `cancel_order_time` datetime DEFAULT NULL COMMENT '取消订单时间', `pay_order_time` datetime DEFAULT NULL COMMENT '支付订单时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `edit_time` datetime DEFAULT NULL COMMENT '编辑时间', `status` tinyint(1) DEFAULT '1' COMMENT '1:正常 0:删除', PRIMARY KEY (`id`), KEY `d_order_ticket_user_order_id_IDX` (`order_number`) USING BTREE, KEY `d_order_ticket_user_user_id_IDX` (`user_id`) USING BTREE, KEY `d_order_ticket_user_ticket_user_id_IDX` (`ticket_user_id`) USING BTREE, KEY `d_order_ticket_user_create_order_time_IDX` (`create_order_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='购票人订单表'; ``` ### 表关系 ![[image-16545ef1.webp]] ## 支付服务 `d_pay_bill` ```sql CREATE TABLE `d_pay_bill` ( `id` bigint(20) NOT NULL COMMENT '主键id', `pay_number` varchar(64) DEFAULT NULL COMMENT '支付流水号', `out_order_no` varchar(64) NOT NULL COMMENT '商户订单号', `pay_channel` varchar(64) DEFAULT NULL COMMENT '支付渠道', `pay_scene` varchar(64) DEFAULT NULL COMMENT '支付环境', `subject` varchar(512) DEFAULT NULL COMMENT '订单标题', `trade_number` varchar(256) DEFAULT NULL COMMENT '三方交易凭证号', `pay_amount` decimal(10,0) NOT NULL COMMENT '支付金额', `pay_bill_type` int(11) NOT NULL COMMENT '支付种类 详细见枚举PayBillType', `pay_bill_status` int(11) NOT NULL DEFAULT '1' COMMENT '账单支付状态 详细见枚举PayBillStatus', `pay_time` datetime DEFAULT NULL COMMENT '支付时间', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '修改时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:未删除 0:删除', PRIMARY KEY (`id`), UNIQUE KEY `d_pay_bill_out_order_no_IDX` (`out_order_no`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付表'; ``` `d_refund_bill` ```sql CREATE TABLE `d_refund_bill` ( `id` bigint(20) NOT NULL COMMENT '主键id', `out_order_no` varchar(64) NOT NULL COMMENT '商户订单号', `pay_bill_id` bigint(20) NOT NULL COMMENT '账单id', `refund_amount` decimal(10,0) NOT NULL COMMENT '退款金额', `refund_status` int(11) NOT NULL DEFAULT '1' COMMENT '账单退款状态 1:未退款 2:已退款', `refund_time` datetime DEFAULT NULL COMMENT '退款时间', `reason` varchar(50) DEFAULT NULL COMMENT '退款原因', `create_time` datetime NOT NULL COMMENT '创建时间', `edit_time` datetime NOT NULL COMMENT '修改时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:未删除 0:删除', PRIMARY KEY (`id`), UNIQUE KEY `d_refund_bill_out_order_no_IDX` (`out_order_no`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='退款表'; ``` ### 表关系 ![[image-18cd75b9.webp]] ## 定制化服务 `d_rule` ```sql CREATE TABLE `d_rule` ( `id` bigint(20) NOT NULL COMMENT 'id', `stat_time` int(11) NOT NULL COMMENT '统计时间', `stat_time_type` int(11) NOT NULL COMMENT '统计时间类型 1:秒 2:分钟', `threshold` int(11) NOT NULL COMMENT '调用限制阈值', `effective_time` int(11) NOT NULL COMMENT '限制时间', `effective_time_type` int(11) NOT NULL COMMENT '限制时间类型 1:秒 2:分钟', `limit_api` text COMMENT '限制路径 逗号分割', `message` varchar(64) DEFAULT NULL COMMENT '限制访问提示语', `status` tinyint(4) DEFAULT '1' COMMENT '状态标识1.正常 0. 禁用 (默认1)', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='调用限制规则表'; ``` d\_depth\_rule d\_depth\_rule `d_depth_rule` ```sql CREATE TABLE `d_depth_rule` ( `id` bigint(20) NOT NULL COMMENT 'id', `start_time_window` varchar(64) NOT NULL COMMENT '[限制开始时间]', `end_time_window` varchar(64) NOT NULL COMMENT '[限制结束时间]', `stat_time` int(11) NOT NULL COMMENT '统计时间', `stat_time_type` int(11) NOT NULL COMMENT '统计时间类型 1:秒 2:分钟', `threshold` int(11) NOT NULL COMMENT '调用限制阈值', `effective_time` int(11) NOT NULL COMMENT '限制时间', `effective_time_type` int(11) NOT NULL COMMENT '限制时间类型 1:秒 2:分钟', `limit_api` text COMMENT '限制路径 逗号分割', `message` varchar(64) DEFAULT NULL COMMENT '限制访问提示语', `status` tinyint(4) DEFAULT '1' COMMENT '状态标识1.正常 0. 禁用 (默认1)', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='深度调用限制规则表'; ``` `d_api_data` ```sql CREATE TABLE `d_api_data` ( `id` bigint(20) NOT NULL COMMENT '主键id', `head_version` varchar(32) DEFAULT NULL COMMENT '请求版本', `api_address` varchar(32) DEFAULT NULL COMMENT '客户端ip', `api_method` varchar(32) DEFAULT NULL COMMENT '请求方法', `api_body` varchar(200) DEFAULT NULL COMMENT '请求体', `api_params` varchar(100) DEFAULT NULL COMMENT '请求参数', `api_url` varchar(100) DEFAULT NULL COMMENT '请求路径', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `status` int(11) DEFAULT '1' COMMENT '状态 1:未删除 0:删除(默认1)', `call_day_time` varchar(64) DEFAULT NULL COMMENT '按天维度记录请求时间', `call_hour_time` varchar(64) DEFAULT NULL COMMENT '按小时维度记录请求时间', `call_minute_time` varchar(64) DEFAULT NULL COMMENT '按分钟维度记录请求时间', `call_second_time` varchar(64) DEFAULT NULL COMMENT '按秒维度记录请求时间', `type` int(11) DEFAULT NULL COMMENT 'api规则生效类型 1一般规则 2深度规则', PRIMARY KEY (`id`), KEY `idx_create_time` (`create_time`) USING BTREE, KEY `idx_api_address` (`api_address`) USING BTREE, KEY `idx_api_url` (`api_url`) USING BTREE, KEY `idx_call_day_time` (`call_day_time`) USING BTREE, KEY `idx_call_hour_time` (`call_hour_time`) USING BTREE, KEY `idx_call_minute_time` (`call_minute_time`) USING BTREE, KEY `idx_call_second_time` (`call_second_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='api执行表'; ``` ### 表关系 ![[image-7b876e24.webp]] --- **企业级项目导航**:⬅️ [[00-各模块吃透|00-各模块吃透]] | 00-数据库表关系 | ➡️ [[01-为什么掌握分片原理就能很容易实现分库分表?|01-为什么掌握分片原理就能很容易实现分库分表?]]