写了个建表语句 review 的 prompt

初衷

作为一个所谓的 “项目负责人”,我的工作之一,就是 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.mzph.cn/pingmian/59121.shtml

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

相关文章

Linux下的Debugfs

debugfs 1. 简介 类似sysfs、procfs&#xff0c;debugfs 也是一种内存文件系统。不过不同于sysfs一个kobject对应一个文件&#xff0c;procfs和进程相关的特性&#xff0c;debugfs的灵活度很大&#xff0c;可以根据需求对指定的变量进行导出并提供读写接口。debugfs又是一个Li…

go 包管理

Go语言所依赖的所有的第三方库都放在GOPATH目录下面 gomodule是Go语言默认的依赖管理工具 Modules是相关Go包的集合&#xff0c;是源代码交换和版本控制的单元&#xff0c;用于指定使用哪些源文件 GO111MODULEoff禁用gomodule&#xff0c;编译时从GOPATH和vendor文件夹中查找包…

Fooocus图像生成软件本地部署教程:在Windows上快速上手AI创作

文章目录 前言1. 本地部署Fooocus图像生成软件1.1 安装方式1.2 功能介绍 2. 公网远程访问Fooocus3. 固定Fooocus公网地址 前言 本篇文章将介绍如何在本地Windows11电脑部署开源AI生图软件Fooocus&#xff0c;并结合Cpolar内网穿透工具轻松实现公网环境远程访问与使用。 Foooc…

Linux高阶——1103——Signal信号机制

1、信号机制 在linux和unix系统下&#xff0c;如果想要处置(挂起&#xff0c;结束)进程&#xff0c;可以使用信号&#xff0c;经典消息机制&#xff0c;所以进程包括系统进程都是利用信号处置进程的 kill -l——查看所有系统支持的信号 1-31号信号——Unix经典信号&#xff…

修改HarmonyOS鸿蒙图标和名字,打包后安装到真机,应用图标丢失变成透明,修改名字也不生效,还是默认的labeL解决方案教程

HarmonyOS鸿蒙打包hap 安装应用到桌面没有图标&#xff0c;用hdc安装到真机&#xff0c;打包后应用图标丢失变成透明&#xff0c;名字也还是默认的label的bug&#xff0c;以下是解决方案 以下是修改方案&#xff1a; 1、修改应用名字&#xff1a; 2、修改应用图标&#xff1a…

Python小游戏20——超级玛丽

首先&#xff0c;你需要确保你的Python环境中安装了pygame库。如果还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; bash pip install pygame 运行效果展示 代码展示 python import pygame import sys # 初始化pygame pygame.init() # 设置屏幕尺寸 screen_width …

CTF-WEB: python模板注入

漏洞是如何产生的&#xff1f; Python模板注入漏洞通常出现在使用模板引擎生成动态内容的应用中。如果用户输入没有经过适当的处理直接插入模板中&#xff0c;就可能会导致模板注入漏洞。一个常见的例子是使用Jinja2模板引擎时&#xff0c;如果直接渲染用户输入&#xff0c;则…

从富文本窥探苹果的代码秘密

从富文本窥探苹果的代码秘密 背景 在我们的业务场景下&#xff0c;为突出诸如 “利益点”和“利率” 等特性以推动订单成交&#xff0c;引入了 “富文本” 这一概念。富文本具备丰富格式的文本展示与编辑功能。然而&#xff0c;恰是由于富文本具有 “多样式”“复杂排版” 等特…

spark集群模式-standalone的配置和使用

其中所需要的python和spark的软件在该文章中 spark-本地模式的配置和简单使用-CSDN博客 环境配置 首先在别的服务器上均要进行python环境的配置 安装spark 1、上传&#xff0c;解压&#xff0c;重命名 tar -zxvf /opt/install/spark-3.1.2-bin-hadoop3.2.tgz -C /opt/modu…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…

AVLTree

1.AVL树的概念 二叉搜索树虽然可以提高查找的效率&#xff0c;但是如果数据有序或者接近有序&#xff0c;二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。为了解决该问题&#xff0c;于是就有了AVLTree。即当向二叉搜索树中插入…

使用 async/await 时未捕获异常的问题及解决方案

使用 async/await 时未捕获异常的问题及解决方案 1. 引言 在现代 JavaScript 开发中&#xff0c;async/await 是处理异步操作的强大工具&#xff0c;它使得异步代码看起来更像同步代码&#xff0c;提升了代码的可读性和可维护性。然而&#xff0c;在使用 async/await 时&…

【数据结构二叉树】C非递归算法实现二叉树的先序、中序、后序遍历

引言: 遍历二叉树&#xff1a;指按某条搜索路径巡访二叉树中每个结点&#xff0c;使得每个结点均被访问一次&#xff0c;而且仅被访问一次。 除了层次遍历外&#xff0c;二叉树有三个重要的遍历方法&#xff1a;先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后…

深入学习 Scrapy 框架:从入门到精通的全面指南

深入学习 Scrapy 框架&#xff1a;从入门到精通的全面指南 引言 在数据驱动的时代&#xff0c;网络爬虫成为了获取信息的重要工具。Scrapy 是一个强大的 Python 爬虫框架&#xff0c;专为快速高效地提取网页数据而设计。本文将深入探讨 Scrapy 的使用&#xff0c;从基础知识到…

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…

SpringBoot+VUE2完成WebSocket聊天(数据入库)

下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…

图文深入介绍Oracle DB link(一)

1. 引言&#xff1a; 本文图文深入介绍Oracle DB link&#xff0c;先介绍基本概念。 2.DB link的定义 数据库链接&#xff08;Database Link&#xff0c;简称 DB Link&#xff09;是 Oracle 数据库中的一个重要功能。它是一种在一个 Oracle 数据库实例中访问另一个 Oracle 数…

MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!

2024-11-04 MoonBit更新 增加了编译期常量的支持。常量的名字以大写字母开头&#xff0c;用语法 const C ... 声明。常量的类型必须是内建的数字类型或 String。常量可以当作普通的值使用&#xff0c;也可以用于模式匹配。常量的值目前只能是字面量&#xff1a; const MIN_…

HTB:Shocker[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on Shocker? 使用nmap对靶机TCP端口进行开放扫描 2.What is the name of the directory available on the webserver that is a standard name known for running scripts via the Common Gateway Int…

【算法赌场】SPFA算法

1.算法简介 SPFA 算法的全称是&#xff1a;Shortest Path Faster Algorithm&#xff0c;是西南交通大学 段凡丁 于 1994 年发表的论文中的名字。不过&#xff0c;段凡丁的证明是错误的&#xff0c;且在 Bellman-Ford 算法提出后不久&#xff08;1957 年&#xff09;已有队列优化…