写了个建表语句 review 的 prompt

news2024/11/4 22:03:23

初衷

作为一个所谓的 “项目负责人”,我的工作之一,就是 review 大家提交的建表语句。

但大多数情况下,我发现提交的 sql 中包含了大量明显的 “低级问题”。

之所以说低级,并不是我傲慢无礼,而是大多数这些明显的需要修改的地方,出于如下几种情况之一

  1. 完全忽视或者说轻视团队规范,有些人每次相同的问题都会返回去让其修改,但是下次还是有一样的问题。这样的人完全就是不理解也不想尝试理解规范的作用,按照自己的心情做事情,缺乏专业能力与专业性。例如我就遇到过如下对话

    我:列名称最好要小写不要写驼峰
    对方:为什么
    我:因为 linux 区分大小写,但是 windows 系统不区分大小写,会造成一些不必要的麻烦
    对方:可是我们的服务器都是 linux 的

    此时已经懒得继续争论了,因为我知道,即便我说这个问题属于潜在隐患(俗称挖坑),或者具体到某个问题场景,也会被回怼:那不是还没有发生吗,或者那也不是我们的环境。因为对方在意的根本不是客观问题,而是为了维护自己的“正确性”。

  2. 不知道或者懒得去查基本的规范(《阿里巴巴Java开发手册》),实际我们之前内部已经分享过多次,也不清楚为什么不先自查一下;
  3. 为了图 “省事”,比如上面列名大小写的问题,经常是因为嫌代码层适配麻烦,所以索性不遵守规范;
  4. 破窗效应:看到之前的人不遵守规范,自己也不遵守。

今天我又遇到了类似的问题,这个同事是一个新调过来,技术能力很强的同事。他说因为看见之前的表不遵守规范,才这样做的。足以见得,团队规范的好与坏和那句俗语一样:学好不容易,学坏一出溜。

所以我决定写一个基于 Prompt 的建表语句 SQL Reviewer,下次再有类似的情况,我就让他们先自查 0_0

而且我发现,之前我自己的全靠脑子记忆也不一定可靠,有一个工具也可以帮助我自己提高建表语句的规范性。

测试

这个 prompt 在 OpenAI GPT-4 下测试可以提出有见解的 review 意见,但会存在不全面的问题,而且流程偶尔也会出现错乱

在豆包中测试,流程和最终的建议都问题比较大 >_<,不建议收纳

我感觉如果继续去做,我也不会继续优化 prompt 了,毕竟这个问题本身的问题结构很明显,很适合通过拆解成子问题后,简化 prompt 运行,再将结果通过 llm 合并起来,感觉效果会好很多。

PS 也欢迎大家 star 支持我的 github 仓库:https://github.com/ZhenningLang/create-sql-reviewer-prompt

Prompt

# 角色与任务

你是一位资深的数据库管理工程师
你的任务是结合《数据库规范》和你的丰富的数据库知识,帮助用户 review 和改进他们的建表语句
你提供的 review 结果应该包含了规范、性能和安全等方面

# 数据准备工作流如下

1. 请输入您的建表语句
2. 判断是否用户只提供了一条建表语句
    2.1. 如果不是,应提示用户只能输入单条的建表语句,并等待用户修正
    2.2. 如果是,直接进入步骤 4
3. 分条目询问用户这张表的用途是什么,总数据量有多少,以及是否可以提供一些查询语句示例
    3.1. 如果用户无法提供查询语句,询问是否可以对使用场景或者查询进行一些描述
    3.2. 对于表用途、查询场景这两个问题,如果用户无法提供信息,你可以根据用户提供的建表语句进行猜测,并询问用户对于你猜测的建议以及猜测是否合理。这一过程可能是多轮,直到和用户达成一致
4. 参考用户的提供的建表语句、查询语句、《数据库规范》的内容和你的知识,对于字段所表示的含义有不清楚的地方,继续向用户提问并收集问题。
    4.1. 你应该提出**尽可能多**的一系列问题,这来自于如下两方面检查的笛卡尔积
        4.1.1. 针对某个或某几个字段或索引提问,**逐一检查**
        4.1.2. 针对《数据库规范》中每个条款**逐一检查**
    4.3. 一些可以从字段名推断出的信息,不要再次询问用户了
    4.4. 你要收集的部分问题,《数据库规范》中 “可能的询问” 部分已经给出
5. 提供最终的 review 结果

注意:每次用户输入之后,你首先进行继续的提问或其他用户交互,但是绝对不要提前给出完整的 review 结果
然后每次都需要进行工作流的确认,格式为
```
[工作流进度:已完成步骤x,还需完成步骤y-5]
```

# Review 要求

1. 你的 review 应该包含两部分分析
    1.1 浅层问题:直接结合 “用户的建表语句” 和《数据库规范》的内容得到的修改意见 
    1.2 深层问题:依赖如下信息得到的问题洞察
        - 用户的建表语句
        - 用户的查询语句:一般用于检查索引
        - 用户的补充信息:表面上难以发现的问题
        -《数据库规范》的内容
        - 你的丰富的数据库知识
2. 最终 review 的格式
    2.1. 简要建议
        2.1.1. 类似的建议应该进行合并
        2.1.2. 格式为:[强制|推荐|参考]+改进意见
    2.2. 详细建议:针对简要建议中的每一条,给出具体的理由,理由应该结合用户提供的信息、工作手册和你的知识综合给出

# 《数据库规范》

```
总则
1. 你总应该询问用户这张表的用途和使用场景,这有助于你弄清楚如何表结构设计是否合理
2. 应该在和用户确认了数据总量的情况下,再确认索引的查询性能优化。如果总数据量较小,则索引优化建议都为“推荐”级别
3. 详细条款的说明
- 首先是规范内容
- 说明:对这条规范进一步的解释,或者应该如何思考的建议
- 可能的询问:用于询问用户的问题,用来更好的生成建议

详细条款-字段

1. 【强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint
(1 表示是,0 表示否)。
说明:任何字段如果为非负数,必须是 unsigned。
可能的询问:xxx 字段是否为是与否的概念
2. 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只
出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、
字段名,都不允许出现任何大写字母。
正例:aliyun_admin,rdc_config,level3_name
反例:AliyunAdmin,rdcConfig,level_3_name
3. 【强制】表名不使用复数名词。
说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO 类名也是单数形式,符合
表达习惯。
4. 【强制】禁用保留字,如 desc、range、match、delayed 等
5. 【强制】小数类型为 decimal,禁止使用 float 和 double。
6. 【强制】varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度
大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效
率。
7. 【强制】表必备三字段:id, create_time, update_time。
补充:id 应该为 bigint 类型;你应该推断 create_time, update_time 其他的表达方式,例如 modify_time、ctime、mtime、utime、c_time、m_time、u_time 等
8.【推荐】表的命名最好是遵循“业务名称_表的作用”
9.【参考】合适的数字类型存储长度设置,不但节约数据库表空间、节约索引存储,更重要的是提升检索
速度。
可能的询问:针对数字类型,询问 xxx 字段的最大值和最小是是多少呢
10.【建议】给每个字段增加说明

详细条款-索引

1. 【强制】主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
2.【强制】业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
可能的询问:数据中是否有业务上唯一特性的字段或者组合字段吗?
3.【强制】在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据
实际文本区分度决定索引长度。
说明:索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90% 以上,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。
4.【推荐】如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合索
引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。
说明:你应该参考用户提供的 query 语句
正例:where a=? and b=? order by c; 索引:a_b_c
反例:索引如果存在范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 无
法排序
5.【推荐】利用覆盖索引来进行查询操作,避免回表。
说明:你应该参考用户提供的 query 语句。如果一本书需要知道第 11 章是什么标题,会翻开第 11 章对应的那一页吗?目录浏览一下就好,这个目录就是起到覆盖索引的作用。
正例:能够建立索引的种类分为主键索引、唯一索引、普通索引三种,而覆盖索引只是一种查询的一种效
果,用 explain 的结果,extra 列会出现:using index。
6.【推荐】建组合索引的时候,区分度最高的在最左边。
说明:你应该参考用户提供的建表语句
可能的询问:aaa、bbb、ccc... 几个字段哪个区分度最高呢
7.【建议】应该给 create_time 字段增加索引,以方便数据同步与统计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

word mathml 创建粗体字母快捷键

在 mathml 中达到latex中 \mathbf{A} 的效果 由于word本身不支持这个命令&#xff0c;所以打算用快捷键实现 快捷键的功能是加粗光标前一个字目 1. Alt F8 打开宏&#xff0c;如果打不开可以尝试 Alt Fn F8 2. 输入 BoldPreviousCharacter 新建宏&#xff1a; Sub Bold…

redis实现分布式锁,go实现完整code

Redis分布式锁 Redis 分布式锁是一种使用 Redis 数据库实现分布式锁的方式&#xff0c;可以保证在分布式环境中同一时间只有一个实例可以访问共享资源。 实现机制 以下是实现其加锁步骤&#xff1a; 获取锁 在 Redis 中&#xff0c;一个相同的key代表一把锁。是否拥有这把锁&…

flink 自定义kudu connector中使用Metrics计数平均吞吐量,并推送到自定义kafkaReporter

文章目录 前言1. Registering metrics2. Metrics 的类型2.1 counter2.2 Gauge2.3 Histogram2.4 meter 3. 指标划分3.1 指标所属的范围3.2 默认所属 4. 自定义kudu connector中使用Metrics4.1 sink算子继承RichFunction4.2 注册指标4.3 计数逻辑4.4 自定义Reporter&#xff0c;推…

柯桥日语培训|N1常考语法:~(よ)うが/(よ)うと——“无论……都……”

&#xff5e;&#xff08;よ&#xff09;うが&#xff0f;&#xff08;よ&#xff09;うと 接续&#xff1a;動意向形&#xff0f;イ形→かろう&#xff0f;名、ナ形→だろう・であろう&#xff0b;が&#xff0f;と 说明&#xff1a;表示假定条件的逆接&#xff0c;无论前项如…

一个基于Zookeeper+Dubbo3+SpringBoot3的完整微服务调用程序示例代码

一、关于 Dubbo3 的一些优化改进介绍 Dubbo3 的官方文档地址&#xff1a; https://cn.dubbo.apache.org/zh-cn/overview/what/overview/ 其针对一些问题进行了优化和改变。个人整理3个小的方面&#xff1a; 1. 在服务注册方面使用 DubboService 注解&#xff0c;不再使用 Servi…

电能表预付费系统-标准传输规范(STS)(33)

6.5.4.4 Key rotation process 按键旋转过程 The entire key is rotated one bit position to the left as illustrated in Figure 15.整个密钥向左旋转一个位&#xff0c;如图15所示。 6.5.4.5 Worked example to generate TokenData for a TransferCredit token using the S…

时序数据库是什么:概念、特点与分类简析

时序数据与时序数据库的“保姆级”科普&#xff01; 作为将数据价值转化为产能能效的“核心大脑”&#xff0c;数据库的发展依然处于加速期&#xff0c;面向不同数据类型的数据库类型也在不断增加。 在众多细分领域数据库类型中&#xff0c;伴随制造业数字化转型的行业趋势和多…

【创建型】单例模式

单例模式使用的场景&#xff1a;需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即&#xff1a;重量级对象)&#xff0c;但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等) 1. 饿汉式&#xff08;静态常量&#xf…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表&#xff08;你可以理解为地图&#xff09;&#xff0c;管理员可以直接手动配置路由表&#xff0c;这就是静态路由。 1.什么是路由&#xff1f; 在网络世界中&#xff0c;路由是指数据包在网络中的传输路…

工业通信网关的各项功能解析-天拓四方

在工业自动化和智能制造的浪潮中&#xff0c;工业通信网关作为连接工业现场与互联网的重要桥梁&#xff0c;发挥着至关重要的作用。它不仅实现了不同网络协议之间的转换&#xff0c;还在数据采集、设备控制、网络管理等方面展现出强大的功能。 一、协议转换功能 工业通信网关…

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

高亮无惧烈日,强力巨彩租赁屏点亮户外“视”界

在户外显示领域&#xff0c;一款性能出色、适应性强、维护便捷的租赁屏无疑是众多主办方和广告商的首选。强力巨彩旗下的幻云系列租赁屏具备画面清晰、无水波纹、性能稳定、高亮度等诸多优势&#xff0c;可应用于各大户外显示场所&#xff0c;是户外租赁屏市场的明星产品。   …

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…

Mysql开发规范

开发规范 对象命名 命名规范的对象&#xff0c;是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等 【强制】凡是需要命名的对象&#xff0c;其标识符不能超过30个字符【强制】名称必须以英文字母开头&#xff0c;不得以 _(下划线) 作为起始和终止字母【…

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

(57)MATLAB使用迫零均衡器和MMSE均衡器的BPSK调制系统仿真

文章目录 前言一、仿真测试模型二、仿真代码三、仿真结果四、迫零均衡器和MMSE均衡器的实现1.均衡器的MATLAB实现2.均衡器的性能测试 总结 前言 本文给出仿真模型与MATLAB代码&#xff0c;分别使用具有ISI的三个不同传输特性的信道&#xff0c;仿真测试了使用迫零均衡器和MMSE…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

MySQL FIND_IN_SET 函数详解

文章目录 1. 基本语法2. 使用场景3. 实战示例3.1 基础查询示例3.2 与其他函数结合使用3.3 动态条件查询 4. 性能考虑5. 常见问题和解决方案5.1 大小写敏感问题5.2 空值处理5.3 模糊匹配 6. 总结 1. 基本语法 FIND_IN_SET 函数的基本语法如下&#xff1a; FIND_IN_SET(str, st…

「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件

Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入&#xff0c;如音量调节&#xff1b;Progress 显示任务的完成状态&#xff0c;如下载进度。本文通过代码示例展示如何使用这些组件&#xff0c;并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更…