优化 invite_codes 表的 SQL 创建语句

种地  金牌会员 | 2024-12-27 22:57:56 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 878|帖子 878|积分 2634


  1. -- auto-generated definition
  2. create table invite_codes
  3. (
  4.     id                 int auto_increment
  5.         primary key,
  6.     invite_code        varchar(6)                                                       not null comment '邀请码,6位整数,确保在有效期内唯一',
  7.     invitor            int                                                              null comment '邀请人的ID,对应admin表中的id字段,表示生成该邀请码的管理员或用户',
  8.     invite_level       tinyint                                                          null comment '邀请层级,对应admin表中level字段的值,表示邀请人的层级',
  9.     generated_date     datetime                               default CURRENT_TIMESTAMP not null comment '生成时间,默认为当前时间',
  10.     expire_time        datetime                                                         null comment '失效时间,可为空',
  11.     remark             text                                                             null comment '备注信息,可为空',
  12.     status             enum ('effective', 'expired', 'bound') default 'effective'       not null comment '邀请码状态,默认为 "effective"',
  13.     bound_phone        varchar(20)                                                      null comment '绑定的手机号,对应admin表中的phone字段,表示与邀请码关联的管理员或用户的手机号',
  14.     weixin_nickname    varchar(255)                                                     null comment '微信用户的昵称,对应user表中的nickname字段,表示与邀请码关联的用户的微信昵称',
  15.     weixin_headimg     varchar(255)                                                     null comment '微信用户的头像URL,对应user表中的avatar字段,表示与邀请码关联的用户的微信头像URL',
  16.     bound_wx_uid       varchar(255)                                                     null comment '微信用户的唯一标识符,对应user表中的weChatUnionId字段,表示与邀请码关联的用户的微信唯一标识符',
  17.     admin_id           int                                                              null comment '管理员ID,关联admin表,可为空',
  18.     user_id            int                                                              null comment '用户ID,关联user表,表示与邀请码关联的用户',
  19.     is_locked          tinyint(1)                             default 0                 not null comment '是否锁定,0表示未锁定,1表示已锁定,默认为0',
  20.     created_date       timestamp                              default CURRENT_TIMESTAMP not null comment '记录创建的时间戳,默认为当前时间',
  21.     last_modified_date timestamp                                                        null on update CURRENT_TIMESTAMP comment '记录最后更新的时间戳,默认为NULL,更新时自动设置为当前时间',
  22.     constraint code
  23.         unique (invite_code),
  24.     constraint invite_codes_ibfk_1
  25.         foreign key (admin_id) references productqualification.admin (id),
  26.     constraint invite_codes_ibfk_2
  27.         foreign key (invitor) references productqualification.admin (id),
  28.     constraint invite_codes_ibfk_3
  29.         foreign key (user_id) references productqualification.user (id)
  30. )
  31.     collate = utf8mb4_unicode_ci;
  32. create index admin_id
  33.     on invite_codes (admin_id);
  34. create index invitor
  35.     on invite_codes (invitor);
  36. create index user_id
  37.     on invite_codes (user_id);
复制代码
好的,我来根据你提供的图片和 SQL 创建语句,详细表明一下 SQL 审核的优化建议,并给出相应的修改方案。
图片内容解读:
图片中展示的是一份 SQL 审核的优化建议,重要分为两个部门:


  • 建议改进 (绿色标识):

    • 字段建议增加备注阐明:id
    • invite_codes 表建议增加备注阐明

  • 埋伏问题 (黄色标识):

    • invite_codes 表不建议使用外键
    • status 字段的范例 enum 不建议使用,建议用 tinyint/char 代替
    • id 是自增字段,建议增加无符号属性 (unsigned)
    • invite_codes 表的校验集建议为: utf8_general_ci | utf8_bin | utf8mb4_general_ci | utf8mb4_bin

针对性优化方案:
根据以上建议和提供的 CREATE TABLE 语句,我给出优化后的 SQL:
  1. CREATE TABLE `invite_codes` (
  2.     `id` INT UNSIGNED AUTO_INCREMENT COMMENT '主键ID,自增长',
  3.     `invite_code` VARCHAR(6) NOT NULL COMMENT '邀请码,6位整数,确保在有效期内唯一',
  4.     `invitor` INT NULL COMMENT '邀请人的ID,对应admin表中的id字段,表示生成该邀请码的管理员或用户',
  5.     `invite_level` TINYINT NULL COMMENT '邀请层级,对应admin表中level字段的值,表示邀请人的层级',
  6.     `generated_date` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '生成时间,默认为当前时间',
  7.     `expire_time` DATETIME NULL COMMENT '失效时间,可为空',
  8.     `remark` TEXT NULL COMMENT '备注信息,可为空',
  9.     `status` TINYINT NOT NULL DEFAULT 0 COMMENT '邀请码状态,0表示有效,1表示已过期,2表示已绑定',
  10.     `bound_phone` VARCHAR(20) NULL COMMENT '绑定的手机号,对应admin表中的phone字段,表示与邀请码关联的管理员或用户的手机号',
  11.     `weixin_nickname` VARCHAR(255) NULL COMMENT '微信用户的昵称,对应user表中的nickname字段,表示与邀请码关联的用户的微信昵称',
  12.     `weixin_headimg` VARCHAR(255) NULL COMMENT '微信用户的头像URL,对应user表中的avatar字段,表示与邀请码关联的用户的微信头像URL',
  13.     `bound_wx_uid` VARCHAR(255) NULL COMMENT '微信用户的唯一标识符,对应user表中的weChatUnionId字段,表示与邀请码关联的用户的微信唯一标识符',
  14.     `admin_id` INT NULL COMMENT '管理员ID,关联admin表,可为空',
  15.     `user_id` INT NULL COMMENT '用户ID,关联user表,表示与邀请码关联的用户',
  16.     `is_locked` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否锁定,0表示未锁定,1表示已锁定,默认为0',
  17.     `created_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '记录创建的时间戳,默认为当前时间',
  18.     `last_modified_date` TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新的时间戳,默认为NULL,更新时自动设置为当前时间',
  19.      PRIMARY KEY (`id`),
  20.     UNIQUE KEY `code` (`invite_code`)
  21. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请码表';
  22. CREATE INDEX `admin_id` ON `invite_codes` (`admin_id`);
  23. CREATE INDEX `invitor` ON `invite_codes` (`invitor`);
  24. CREATE INDEX `user_id` ON `invite_codes` (`user_id`);
复制代码
详细修改阐明:

  • id 字段添加备注:

    • 在 id 字段的界说中添加 COMMENT '主键ID,自增长',以表明该字段的作用。

  • invite_codes 表添加备注:

    • 在 CREATE TABLE 语句的末端添加 COMMENT='约请码表',阐明此表的作用。

  • id 字段添加 UNSIGNED 属性:

    • 将 INT 修改为 INT UNSIGNED,表示 id 列的值为非负整数。 这可以增加 id 列的最大值,因为无符号整数比有符号整数的范围更大。

  • 移除外键约束(invite_codes_ibfk_1, invite_codes_ibfk_2, invite_codes_ibfk_3):

    • 根据建议,取消外键约束。 固然外键可以包管数据划一性, 但是假如数据量过大, 外键约束会降低性能。 假如你的应用本身可以包管数据划一性,可以去掉外键约束。
    • 假如你的应用确实必要外键约束,并且性能不会是瓶颈,那么可以保留外键约束。

  • status 字段范例修改为 TINYINT:

    • 将 status 字段的范例从 enum ('effective', 'expired', 'bound') 修改为 TINYINT NOT NULL DEFAULT 0, 并添加解释 COMMENT '约请码状态,0表示有效,1表示已逾期,2表示已绑定'。
    • enum 范例在数据库中存储的是字符串,而 tinyint 存储的是整数。 使用 tinyint 存储状态,性能更高。
    • 使用 tinyint 范例时,必要在解释中明确每个数字的含义。

  • 设置表的字符集和排序规则:

    • 在 CREATE TABLE 语句中使用 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci。
    • utf8mb4 字符集支持更广泛的 Unicode 字符,可以制止乱码问题。
    • utf8mb4_unicode_ci 是一种不区分巨细写的排序规则, 在比力字符串时忽略巨细写。
    • 这里选择 utf8mb4_unicode_ci 排序规则,因为该表中有昵称等数据, 选择此排序规则, 比力字符串时可以忽略巨细写。
    • 假如你必要更精细的排序, 可以选择 utf8mb4_bin。
    • 你也可以使用 utf8_general_ci 或 utf8_bin, 但思量到 utf8mb4 对 Unicode 的支持更好, 推荐使用 utf8mb4 的字符集和排序规则。

  • 添加索引:


  • 保留原有的 admin_id, invitor, user_id 的索引。
其他阐明:


  • 解释 (COMMENT): 在代码中添加符合的解释很重要,可以进步代码的可读性,方便后期维护。
  • 外键约束: 外键约束通常用于包管数据完整性,但是会降低性能, 你必要根据实际情况选择是否使用。
  • 数据范例选择: 选择符合的数据范例可以有效地利用存储空间, 并进步查询服从。
  • COLLATE 和 CHARSET: 正确设置字符集和排序规则可以制止乱码问题,并且影响查询时的排序和比力规则。
总结:
优化后的 SQL 语句,根据了图片上的建议,添加了解释, 修改了 id 列的属性, 移除了外键约束,修改了 status 列的范例, 并设置了表的字符集和排序规则。 从而使 SQL 语句更清晰,布局更合理,也更能进步性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表