21 条MySQL 开发规范,太详细了,建议收藏!

数据库对象命名规范

1、数据库对象

数据库对象是数据库的组成部分,常见的有以下几种:表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。

2、数据库对象全局命名规范

  • 1、命名使用具有意义的英文词汇,词汇中间以下划线分隔

  • 2、命名只能使用英文字母、数字、下划线,以英文字母开头

  • 3、避免用MySQL的保留字如:backup、call、group等

    4、所有数据库对象使用小写字母,实际上MySQL中是可以设置大小写是否敏感的,为了保证统一性,我们这边规范全部小写表示。

    3、数据库命名规范

  • 1、数据库命名尽量不超过30个字符。

  • 2、数据库命名一般为项目名称+代表库含义的简写,比如IM项目的工作流数据库,可以是 im_flow。

  • 3、数据库创建时必须添加默认字符集和校对规则子句。默认字符集为UTF8(已迁移dumbo的使用utf8mb4)

  • 4、命名应使用小写。

4、表命名规范
  • 1、常规表表名以t_开头,t代表table的意思,命名规则即 t + 模块(包含模块含义的简写)+ 表(包含表含义的简写),比如用户模块的教育信息表:t_user_eduinfo。

  • 2、临时表(RD、QA或DBA同学用于数据临时处理的表),命名规则:temp前缀+模块+表+日期后缀:temp_user_eduinfo_20210719。

  • 3、备份表(用于保存和归档历史数据或者作为灾备恢复的数据)命名规则,bak前缀+模块+表+日期后缀:bak_user_eduinfo_20210719。

  • 4、同一个模块的表尽可能使用相同的前缀,表名称尽可能表达含义。

  • 5、多个单词以下划线 _ 分隔。

  • 6、常规表表名尽量不超过30个字符,temp表和bak表视情况而定,也尽量简短为宜,命名应使用小写。

5、字段命名规范
  • 1、字段命名需要表示其实际含义的英文单词或简写,单词之间用下划线 _ 进行连接,如 service_ip、service_port。

  • 2、各表之间相同意义的字段必须同名,比如a表和b表都有创建时间,应该统一为create_time,不一致会很混乱。

  • 3、多个单词以下划线 _ 分隔

  • 4、字段名尽量不超过30个字符,命名应该使用小写

6、索引命名规范
  • 1、唯一索引使用uni + 字段名 来命名:create unique index uni_uid on t_user_basic(uid) 。

  • 2、非唯一索引使用idx + 字段名 来命名:create index idx_uname_mobile on t_user_basic(uname,mobile) 。

  • 3、多个单词以下划线 _ 分隔。

  • 4、索引名尽量不超过50个字符,命名应该使用小写,组合索引的字段不宜太多,不然也不利于查询效率的提升。

  • 5、多单词组成的列名,取尽可能代表意义的缩写,如 test_contact表member_id和friend_id上的组合索引:idx_mid_fid。

  • 6、理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)。

7、视图命名规范
  • 1、视图名以v开头,表示view,完整结构是v+视图内容含义缩写。

  • 2、如果视图只来源单个表,则为v+表名。如果视图由几个表关联产生就用v+下划线(_)连接几个表名,视图名尽量不超过30个字符。如超过30个字符则取简写。

  • 3、如无特殊需要,严禁开发人员创建视图。

  • 4、命名应使用小写。

8、存储过程命名规范
  • 1、存储过程名以sp开头,表示存储过程(storage procedure)。之后多个单词以下划线(_)进行连接。存储过程命名中应体现其功能。存储过程名尽量不能超过30个字符。

  • 2、存储过程中的输入参数以i_开头,输出参数以o_开头。

  • 3、命名应使用小写。

create procedure sp_multi_param(in i_id bigint,in i_name varchar(32),out o_memo varchar(100))  
9、函数命名规范
  • 1、函数名以func开始,表示function。之后多个单词以下划线(_)进行连接,函数命名中应体现其功能。函数名尽量不超过30个字符。

  • 2、命名应使用小写。

create function func_format_date(ctime datetime)
10、触发器命名规范
  • 1、触发器以trig开头,表示trigger 触发器。

  • 2、基本部分,描述触发器所加的表,触发器名尽量不超过30个字符。

  • 3、后缀(_i,_u,_d),表示触发条件的触发方式(insert,update或delete)。

  • 4、命名应使用小写。

DROP TRIGGER IF EXISTS trig_attach_log_d;
CREATE TRIGGER trig_attach_log_d AFTER DELETE ON t_dept FOR EACH ROW; 
11、约束命名规范
  • 1、唯一约束:uk_表名称_字段名。uk是UNIQUE KEY的缩写。比如给一个部门的部门名称加上唯一约束,来保证不重名,如下:ALTER TABLE t_dept ADD CONSTRAINT un_name UNIQUE(name);

  • 2、外键约束:fk_表名,后面紧跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名用下划线(_)分隔。如下:ALTER TABLE t_user ADD CONSTRAINT fk_user_dept FOREIGN KEY(depno) REFERENCES t_dept (id);

  • 3、非空约束:如无特殊需要,建议所有字段默认非空(not null),不同数据类型必须给出默认值(default)。

`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT '',
`deptId` int(11) DEFAULT 0,
`salary` float DEFAULT NULL, 
  • 4、出于性能考虑,如无特殊需要,建议不使用外键。参照完整性由代码控制。这个也是我们普遍的做法,从程序角度进行完整性控制,但是如果不注意,也会产生脏数据。

  • 5、命名应使用小写。

12、用户命名规范
  • 1、生产使用的用户命名格式为 code_应用

  • 2、只读用户命名规则为 read_应用

数据库对象设计规范

13、存储引擎的选择
  • 1、如无特殊需求,必须使用innodb存储引擎。

可以通过 show variables like 'default_storage_engine'来查看当前默认引擎。主要有MyISAM 和 InnoDB,从5.5版本开始默认使用 InnoDB 引擎。

基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

14、字符集的选择
  • 1、如无特殊要求,必须使用utf8或utf8mb4。

在国内,选择对中文和各语言支持都非常完善的utf8格式是最好的方式,MySQL在5.5之后增加utf8mb4编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。

所以utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

可以使用如下脚本来查看数据库的编码格式

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
-- 或
SHOW VARIABLES Like '%char%'; 
15、表设计规范
  • 1、不同应用间所对应的数据库表之间的关联应尽可能减少,不允许使用外键对表之间进行关联,确保组件对应的表之间的独立性,为系统或表结构的重构提供可能性。目前业内的做法一般 由程序控制参照完整性。

  • 2、表设计的角度不应该针对整个系统进行数据库设计,而应该根据系统架构中组件划分,针对每个组件所处理的业务进行数据库设计。

  • 3、表必须要有PK,主键的优势是唯一标识、有效引用、高效检索,所以一般情况下尽量有主键字段。

  • 4、一个字段只表示一个含义。

  • 5、表不应该有重复列。

  • 6、禁止使用复杂数据类型(数组,自定义等),Json类型的使用视情况而定。

  • 7、需要join的字段(连接键),数据类型必须保持绝对一致,避免隐式转换。比如关联的字段都是int类型。

  • 8、设计应至少满足第三范式,尽量减少数据冗余。一些特殊场景允许反范式化设计,但在项目评审时需要对冗余字段的设计给出解释。

  • 9、TEXT字段作为大体量文本存储,必须放在独立的表中 , 用PK与主表关联。如无特殊需要,禁止使用TEXT、BLOB字段。

  • 10、需要定期删除(或者转移)过期数据的表,通过分表解决,我们的做法是按照2/8法则将操作频率较低的历史数据迁移到历史表中,按照时间或者则曾Id做切割点。

  • 11、单表字段数不要太多,建议最多不要大于50个。过度的宽表对性能也是很大的影响。

  • 12、MySQL在处理大表时,性能就开始明显降低,所以建议单表物理大小限制在16GB,表中数据行数控制在2000W内。

    • 业内的规则是超过2000W性能开始明显降低。但是这个值是灵活的,你可以根据实际情况进行测试来判断,比如阿里的标准就是500W,百度的确是2000W。实际上是否宽表,单行数据所占用的空间都有起到作用的。

  • 13、如果数据量或数据增长在前期规划时就较大,那么在设计评审时就应加入分表策略,数据拆分的做法:垂直拆分、水平拆分;

  • 14、无特殊需求,严禁使用分区表

16、字段设计规范
  • 1、INT:如无特殊需要,存放整型数字使用UNSIGNED INT型,整型字段后的数字代表显示长度。比如 id int(11) NOT NULL

  • 2、DATETIME:所有需要精确到时间(时分秒)的字段均使用DATETIME,不要使用TIMESTAMP类型。

对于TIMESTAMP,它把写入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。

另外DATETIME存储的范围也比较大:

timestamp所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。
datetime所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

但是特殊情况,对于跨时区的业务,TIMESTAMP更为合适。

  • 3、VARCHAR:所有动态长度字符串 全部使用VARCHAR类型,类似于状态等有限类别的字段,也使用可以比较明显表示出实际意义的字符串,而不应该使用INT之类的数字来代替;VARCHAR(N),

N表示的是字符数而不是字节数。比如VARCHAR(255),可以最大可存储255个字符(字符包括英文字母,汉字,特殊字符等)。但N应尽可能小,因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节,且存储字符个数由所选字符集决定。

如UTF8存储一个字符最大要3个字节,那么varchar在存放占用3个字节长度的字符时不应超过21845个字符。同时,在进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。(如无特殊需要,原则上单个varchar型字段不允许超过255个字符)

  • 4、TEXT:仅仅当字符数量可能超过20000个的时候,才可以使用TEXT类型来存放字符类数据,因为所有MySQL数据库都会使用UTF8字符集。

所有使用TEXT类型的字段必须和原表进行分拆,与原表主键单独组成另外一个表进行存放,与大文本字段的隔离,目的是。如无特殊需要,不使用MEDIUMTEXT、TEXT、LONGTEXT类型

  • 5、对于精确浮点型数据存储,需要使用DECIMAL,严禁使用FLOAT和DOUBLE。

  • 6、如无特殊需要,尽量不使用BLOB类型

  • 7、如无特殊需要,字段建议使用NOT NULL属性,可用默认值代替NULL

  • 8、自增字段类型必须是整型且必须为UNSIGNED,推荐类型为INT或BIGINT,并且自增字段必须是主键或者主键的一部分。

17、索引设计规范
  • 1、索引区分度

索引必须创建在索引选择性(区分度)较高的列上,选择性的计算方式为:  selecttivity = count(distinct c_name)/count(*) ;如果区分度结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行

  • 2、遵循最左前缀

对于确定需要组成组合索引的多个字段,设计时建议将选择性高的字段靠前放。使用时,组合索引的首字段,必须在where条件中,且需要按照最左前缀规则去匹配。

  • 3、禁止使用外键,可以在程序级别来约束完整性

  • 4、Text类型字段如果需要创建索引,必须使用前缀索引

  • 5、单张表的索引数量理论上应控制在5个以内。经常有大批量插入、更新操作表,应尽量少建索引,索引建立的原则理论上是多读少写的场景。

  • 6、ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面,形成覆盖索引

  • 7、正确理解和计算索引字段的区分度,文中有计算规则,区分度高的索引,可以快速得定位数据,区分度太低,无法有效的利用索引,可能需要扫描大量数据页,和不使用索引没什么差别。

  • 8、正确理解和计算前缀索引的字段长度,文中有判断规则,合适的长度要保证高的区分度和最恰当的索引存储容量,只有达到最佳状态,才是保证高效率的索引。

  • 9、联合索引注意最左匹配原则:必须按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询(>、<、between、like)然后停止匹配。

如:depno=1 and empname>'' and job=1 如果建立(depno,empname,job)顺序的索引,job是用不到索引的。
  • 10、应需而取策略,查询记录的时候,不要一上来就使用*,只取需要的数据,可能的话尽量只利用索引覆盖,可以减少回表操作,提升效率。

  • 11、正确判断是否使用联合索引(上面联合索引的使用那一小节有说明判断规则),也可以进一步分析到索引下推(IPC),减少回表操作,提升效率。

  • 12、避免索引失效的原则:禁止对索引字段使用函数、运算符操作,会使索引失效。这是实际上就是需要保证索引所对应字段的”干净度“。

  • 13、避免非必要的类型转换,字符串字段使用数值进行比较的时候会导致索引无效。

  • 14、模糊查询'%value%'会使索引无效,变为全表扫描,因为无法判断扫描的区间,但是'value%'是可以有效利用索引。

  • 15、索引覆盖排序字段,这样可以减少排序步骤,提升查询效率

  • 16、尽量的扩展索引,非必要不新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

举例子:比如一个品牌表,建立的的索引如下,一个主键索引,一个唯一索引

PRIMARY KEY (`id`),
UNIQUE KEY `uni_brand_define` (`app_id`,`define_id`)

当你同事业务代码中的检索语句如下的时候,应该立即警告了,即没有覆盖索引,也没按照最左前缀原则:

select brand_id,brand_name from  ds_brand_system where status=?  and define_id=?  and app_id=?

建议改成如下:

select brand_id,brand_name from  ds_brand_system where app_id=? and define_id=?  and  status=? 
18、约束设计规范
  • 1、PK应该是有序并且无意义的,由开发人员自定义,尽可能简短,并且是自增序列。

  • 2、表中除PK以外,还存在唯一性约束的,可以在数据库中创建以“uk_”作为前缀的唯一约束索引。

  • 3、PK字段不允许更新。

  • 4、禁止创建外键约束,外键约束由程序控制。

  • 5、如无特殊需要,所有字段必须添加非空约束,即not null。

  • 6、如无特殊需要,所有字段必须有默认值。

SQL使用规范

19、select 检索的规范性
  • 1、尽量避免使用select *,join语句使用select *可能导致只需要访问索引即可完成的查询需要回表取数。

  • 一种是可能取出很多不需要的数据,对于宽表来说,这是灾难;一种是尽可能避免回表,因为取一些根本不需要的数据而回表导致性能低下,是很不合算。

  • 2、严禁使用 select * from t_name ,而不加任何where条件,道理一样,这样会变成全表全字段扫描。

  • 3、MySQL中的text类型字段存储:

    • 3.1、不与其他普通字段存放在一起,因为读取效率低,也会影响其他轻量字段存取效率。

    • 3.2、如果不需要text类型字段,又使用了select *,会让该执行消耗大量io,效率也很低下

  • 4、在取出字段上可以使用相关函数,但应尽可能避免出现 now() , rand() , sysdate() 等不确定结果的函数,在Where条件中的过滤条件字段上严禁使用任何函数,包括数据类型转换函数。大量的计算和转换会造成效率低下,这个在索引那边也描述过了。

  • 5、分页查询语句全部都需要带有排序条件 , 否则很容易引起乱序

  • 6、用in()/union替换or,效率会好一些,并注意in的个数小于300

  • 7、严禁使用%前缀进行模糊前缀查询:如:select a,b,c from t_name where a like ‘%name’;可以使用%模糊后缀查询如:select a,b from t_name where a like ‘name%’;

  • 8、避免使用子查询,可以把子查询优化为join操作

通常子查询在in子句中,且子查询中为简单SQL(不包含union、group by、order by、limit从句)时,才可以把子查询转化为关联查询进行优化。

20、子查询性能差的原因:
  • 子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能 会受到一定的影响;

  • 特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大;

  • 由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。

21、操作的规范性
  • 1、禁止使用不含字段列表的INSERT语句

如:insert into values ('a','b','c');  应使用  insert into t_name(c1,c2,c3) values ('a','b','c'); 。
  • 2、大批量写操作(UPDATE、DELETE、INSERT),需要分批多次进行操作

    • 大批量操作可能会造成严重的主从延迟,特别是主从模式下,大批量操作可能会造成严重的主从延迟,因为需要slave从master的binlog中读取日志来进行数据同步。

    • binlog日志为row格式时会产生大量的日志

程序上的约束

后续我们团队的目标是研发评审工具对开发同学提交的建库、建表、刷数据、查询的语句进行分析,看看是否符合应有的规范。如果不符合,驳回修改。

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

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

相关文章

亚马逊电子产品审核?需要提交UL测试报告?

亚马逊要求销售的电子产品&#xff0c;必须经过检测符合标准才可以上架。 要办理亚马逊美国站UL测试报告&#xff0c;你需要联系国内的第三方检测机构&#xff0c;当然必须是由符合ISO17025/ILAC ISO 17025标准的实验室出具的合格报告&#xff0c;ISO 17025标准是国际上广泛认…

使用flex布局写6种骰子

使用flex布局写6种骰子&#x1f3b2; 效果图 概述说明 不使用position定位&#xff0c;完全靠flex进行分配位置。 在线查看 点击查看 完整代码 <template><div class"content"><ul class"list"><li class"item" v-fo…

视频图像的两种表示方式YUV与RGB(1)

了解过计算机图形图像学的该知道&#xff0c;可用RGB和YUV两种方式表示图像像素&#xff0c;视频由一帧一帧的图像组成&#xff0c;每一张图片是一个一个的像素点组成&#xff0c;既然有两种表示像素的方法&#xff0c;那就一起解一下两种表示方式的异同及优缺点。 RGB像素 这…

声明结构体变量时,是否一定要加struct关键字?

在C语言中&#xff0c;当你声明一个结构体变量时&#xff0c;是否需要使用struct关键字取决于你是否已经为结构体类型定义了一个别名。 如果你没有使用typedef为结构体定义别名&#xff0c;那么在声明结构体变量时&#xff0c;你确实需要使用struct关键字来指明变量所属的类型。…

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…

进制转换(0123456789ABCDEF)

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {//将十进制数M转化为N进制数Scanner sc new Scanner(System.in);int m sc.nextInt();int n sc.nextInt();StringBuffer sb new StringBuffer();//1String s "0123456789…

从零开始学Python(五)面向对象

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Python的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.类的定义 二.魔法方法 1.概念 2.常…

Javascript进阶内容

1. 作用域 1.1 局部作用域 局部作用域分为函数作用域 和 块级作用域 块级作用域就是用 {} 包起来的&#xff0c;let、const声明的变量就是产生块作用域&#xff0c;var不会&#xff1b;不同代码块之间的变量无法互相访问&#xff0c;里面的变量外部无法访问 1.2 全局作用域…

【C/C++面试必备】声明和定义的区别

本文来介绍一下声明和定义的区别&#xff0c;本文中的程序以 C/C 为例进行说明。 一、变量的声明和定义 1.1 声明 声明是用来告诉编译器变量的名称和类型&#xff0c;而不分配内存。 例如&#xff1a; extern int var; // 声明extern int ble 10; // 定义typedef int INT;…

2024HW --->反序列化漏洞!

对于反序列化&#xff0c;这个漏洞也是常用的&#xff0c;不过涉及到的方面非常非常广&#xff0c;比其他漏洞也难很多 于是本篇文章就分成PHP和JAVA的反序列化来讲讲 1.反序列化 想要理解反序列化&#xff0c;首先就要理解序列化 序列化&#xff1a;把对象转换为字节序列的过…

默克尔(Merkle)树 - 原理及用途

默克尔&#xff08;Merkle&#xff09;树的原理以及用途 引言 在当今数字化时代&#xff0c;确保数据的完整性是至关重要的。默克尔树作为一种高效的数据结构&#xff0c;被广泛应用于网络安全、分布式系统以及加密货币等领域&#xff0c;用于验证大量数据的完整性和一致性 数…

【HTB】 OpenSource

OpenSource 靶机地址&#xff1a;https://app.hackthebox.com/machines/471 信息收集 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV -p- 10.129.212.208 --min-rate5000 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-08 16:01 CST Nmap scan report f…

GPIO口工作原理的超详细解释

一、GPIO基本结构 每个GPIO内部都有这样的一个电路结构&#xff0c;这个结构在本文下面会具体介绍。 这边的电路图稍微提一下&#xff1a; 保护二极管&#xff1a; IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时&#xff0c;上方的二…

Altair® (澳汰尔)Inspire™ Print3D 打造高效的增材制造设计

Altair &#xff08;澳汰尔&#xff09;Inspire™ Print3D 打造高效的增材制造设计 借助 Inspire Print3D&#xff0c;可加速创新、结构高效的 3D 打印部件的创建、优化和研究&#xff0c;提供快速准确的工具集&#xff0c;可用于实现选择性激光熔融 (SLM) 部件的设计和过程仿…

Bilstm双向长短期神经网络多输入单输出回归分析

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络的多输入单输出回归分析,基于bilstm的多输入单输出回归分析 完整代码:Bilstm双向长短期神经网络多输入单输出回归分析.zip资源-CSDN文库 https://download.csdn.net/download/abc9918351…

基于SSM+Jsp+Mysql的快递管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

背包问题四种类型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、01背包二、完全背包1.引入库 三.多重背包优化&#xff1a; 四.分组背包总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&…

第十三章 OpenGL ES-RGB、HSV、HSL模型介绍

第十三章 OpenGL ES-RGB、HSV、HSL模型详细介绍 第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵…

ubuntu23 安装nodejs

在 Ubuntu 23 上安装 Node.js&#xff0c;您可以遵循以下步骤&#xff1a; 步骤 1: 更新系统软件包 首先&#xff0c;确保您的 Ubuntu 系统软件包列表是最新的。打开终端&#xff08;Terminal&#xff09;并运行&#xff1a; sudo apt update输入您的用户密码&#xff08;输…

模拟memcpy和memmove

memcpy是内存复制函数&#xff0c;原型如下 void *memmove(void *dest, const void *src, size_t count) 从src地址复制count个字节到dest 模拟实现 void *memcpy(void *dest, const void *src, size_t count) {if (dest NULL || src NULL)return NULL;void *ans dest;f…