当前位置: 首页 > news >正文

如何规范的设计数据库表

前言对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。后端开发的日常工作,需要不断的建库和建表,来满足业务需求。通常情况下,建库的频率比建表要低很多,所以,我们这篇文章主要讨论建表相关的内容。如果我们在建表的时候不注意细节,等后面系统上线之后,表的维护成本变得非常高,而且很容易踩坑。今天就跟大家一起聊聊,数据库建表的15个小技巧,希望对你会有所帮助。
在这里插入图片描述

1.名字


建表的时候,给表、字段和索引起个好名字,真的太重要了。
1.1 见名知意名字就像表、字段和索引的一张脸,可以给人留下第一印象。好的名字,言简意赅,见名知意,让人心情愉悦,能够提高沟通和维护成本。坏的名字,模拟两可,不知所云。而且显得杂乱无章,看得让人抓狂。
反例:用户名称字段定义成:yong_hu_ming、用户_name、name、user_name_123456789

你看了可能会一脸懵逼,这是什么骚操作?正例:用户名称字段定义成:user_name

温馨提醒一下,名字也不宜过长,尽量控制在30个字符以内。
1.2 大小写名字尽量都用小写字母,因为从视觉上,小写字母更容易让人读懂。反例:字段名:PRODUCT_NAME、PRODUCT_name

全部大写,看起来有点不太直观。而一部分大写,一部分小写,让人看着更不爽。正例:字段名:product_name

名字还是使用全小写字母,看着更舒服。
1.3 分隔符
很多时候,名字为了让人好理解,有可能会包含多个单词。那么,多个单词间的分隔符该用什么呢?反例:字段名:productname、productName、product name、product@name

单词间没有分隔,或者单词间用驼峰标识,或者单词间用空格分隔,或者单词间用@分隔,这几种方式都不太建议。正例:字段名:product_name

强烈建议大家在单词间用_分隔。
1.4 表名
对于表名,在言简意赅,见名知意的基础之上,建议带上业务前缀。如果是订单相关的业务表,可以在表名前面加个前缀:order_。例如:order_pay、order_pay_detail等。如果是商品相关的业务表,可以在表名前面加个前缀:product_。例如:product_spu,product_sku等。这样做的好处是为了方便归类,把相同业务的表,可以非常快速的聚集到一起。另外,还有有个好处是,如果哪天有非订单的业务,比如:金融业务,也需要建一个名字叫做pay的表,可以取名:finance_pay,就能非常轻松的区分。这样就不会出现同名表的情况。
1.5 字段名称
字段名称是开发人员发挥空间最大,但也最容易发生混乱的地方。比如有些表,使用flag表示状态,另外的表用status表示状态。可以统一一下,使用status表示状态。如果一个表使用了另一个表的主键,可以在另一张表的名后面,加_id或_sys_no,例如:在product_sku表中有个字段,是product_spu表的主键,这时候可以取名:product_spu_id或product_spu_sys_no。还有创建时间,可以统一成:create_time,修改时间统一成:update_time。删除状态固定为:delete_status。其实还有很多公共字段,在不同的表之间,可以使用全局统一的命名规则,定义成相同的名称,以便于大家好理解。
1.6 索引名
在数据库中,索引有很多种,包括:主键、普通索引、唯一索引、联合索引等。每张表的主键只有一个,一般使用:id或者sys_no命名。普通索引和联合索引,其实是一类。在建立该类索引时,可以加ix_前缀,比如:ix_product_status。唯一索引,可以加ux_前缀,比如:ux_product_code。

2.字段类型


在设计表时,我们在选择字段类型时,可发挥空间很大。
时间格式的数据有:date、datetime和timestamp等等可以选择。
字符类型的数据有:varchar、char、text等可以选择。
数字类型的数据有:int、bigint、smallint、tinyint等可以选择。
说实话,选择很多,有时候是一件好事,也可能是一件坏事。如何选择一个合适的字段类型,变成了我们不得不面对的问题。如果字段类型选大了,比如:原本只有1-10之间的10个数字,结果选了bigint,它占8个字节。其实,1-10之间的10个数字,每个数字1个字节就能保存,选择tinyint更为合适。这样会白白浪费7个字节的空间。如果字段类型择小了,比如:一个18位的id字段,选择了int类型,最终数据会保存失败。所以选择一个合适的字段类型,还是非常重要的一件事情。以下原则可以参考一下:尽可能选择占用存储空间小的字段类型,在满足正常业务需求的情况下,从小到大,往上选。如果字符串长度固定,或者差别不大,可以选择char类型。如果字符串长度差别较大,可以选择varchar类型。是否字段,可以选择bit类型。枚举字段,可以选择tinyint类型。主键字段,可以选择bigint类型。金额字段,可以选择decimal类型。时间字段,可以选择timestamp或datetime类型。

3.字段长度


前面我们已经定义好了字段名称,选择了合适的字段类型,接下来,需要重点关注的是字段长度了。比如:varchar(20),biginit(20)等。那么问题来了,varchar代表的是字节长度,还是字符长度呢?答:在mysql中除了varchar和char是代表字符长度之外,其余的类型都是代表字节长度。biginit(n) 这个n表示什么意思呢?假如我们定义的字段类型和长度是:bigint(4),bigint实际长度是8个字节。现在有个数据a=1,a显示4个字节,所以在不满4个字节时前面填充0(前提是该字段设置了zerofill属性),比如:0001。当满了4个字节时,比如现在数据是a=123456,它会按照实际的长度显示,比如:123456。但需要注意的是,有些mysql客户端即使满了4个字节,也可能只显示4个字节的内容,比如会显示成:1234。所以bigint(4),这里的4表示显示的长度为4个字节,实际长度还是占8个字节。

4.字段个数


我们在建表的时候,一定要对字段个数做一些限制。我之前见过有人创建的表,有几十个,甚至上百个字段,表中保存的数据非常大,查询效率很低。如果真有这种情况,可以将一张大表拆成多张小表,这几张表的主键相同。建议每表的字段个数,不要超过20个。

5. 主键


在创建表时,一定要创建主键。因为主键自带了主键索引,相比于其他索引,主键索引的查询效率最高,因为它不需要回表。此外,主键还是天然的唯一索引,可以根据它来判重。在单个数据库中,主键可以通过AUTO_INCREMENT,设置成自动增长的。但在分布式数据库中,特别是做了分库分表的业务库中,主键最好由外部算法(比如:雪花算法)生成,它能够保证生成的id是全局唯一的。除此之外,主键建议保存跟业务无关的值,减少业务耦合性,方便今后的扩展。不过我也见过,有些一对一的表关系,比如:用户表和用户扩展表,在保存数据时是一对一的关系。这样,用户扩展表的主键,可以直接保存用户表的主键。

6.存储引擎


在mysql5.1以前的版本,默认的存储引擎是myslam,而mysql5.1以后的版本,默认的存储引擎变成了innodb。之前我们还在创建表时,还一直纠结要选哪种存储引擎?myslam的索引和数据分开存储,而有利于查询,但它不支持事务和外键等功能。而innodb虽说查询性能,稍微弱一点,但它支持事务和外键等,功能更强大一些。以前的建议是:读多写少的表,用myslam存储引擎。而写多读多的表,用innodb。但虽说mysql对innodb存储引擎性能的不断优化,现在myslam和innodb查询性能相差已经越来越小。所以,建议我们在使用mysql8以后的版本时,直接使用默认的innodb存储引擎即可,无需额外修改存储引擎。

7. NOT NULL


在创建字段时,需要选择该字段是否允许为NULL。我们在定义字段时,应该尽可能明确该字段NOT NULL。为什么呢?我们主要以innodb存储引擎为例,myslam存储引擎没啥好说的。主要有以下原因:在innodb中,需要额外的空间存储null值,需要占用更多的空间。null值可能会导致索引失效。null值只能用is null或者is not null判断,用=号判断永远返回false。因此,建议我们在定义字段时,能定义成NOT NULL,就定义成NOT NULL。但如果某个字段直接定义成NOT NULL,万一有些地方忘了给该字段写值,就会insert不了数据。这也算合理的情况。但有一种情况是,系统有新功能上线,新增了字段。上线时一般会先执行sql脚本,再部署代码。由于老代码中,不会给新字段赋值,则insert数据时,也会报错。由此,非常有必要给NOT NULL的字段设置默认值,特别是后面新增的字段。例如:alter table product_sku add column brand_id int(10) not null default 0;

8.外键

在mysql中,是存在外键的。外键存在的主要作用是:保证数据的一致性和完整性。例如:create table class (
id int(10) primary key auto_increment,
cname varchar(15)
);

有个班级表class。然后有个student表:create table student(
id int(10) primary key auto_increment,
name varchar(15) not null,
gender varchar(10) not null,
cid int,
foreign key(cid) references class(id)
);

其中student表中的cid字段,保存的class表的id,这时通过foreign key增加了一个外键。这时,如果你直接通过student表的id删除数据,会报异常:a foreign key constraint fails

必须要先删除class表对于的cid那条数据,再删除student表的数据才行,这样能够保证数据的一致性和完整性。顺便说一句:只有存储引擎是innodb时,才能使用外键。如果只有两张表的关联还好,但如果有十几张表都建了外键关联,每删除一次主表,都需要同步删除十几张子表,很显然性能会非常差。因此,互联网系统中,一般建议不使用外键。因为这类系统更多的是为了性能考虑,宁可牺牲一点数据一致性和完整性。除了外键之外,存储过程和触发器也不太建议使用,他们都会影响性能。

9. 索引


在建表时,除了指定主键索引之外,还需要创建一些普通索引。例如:create table product_sku(
id int(10) primary key auto_increment,
spu_id int(10) not null,
brand_id int(10) not null,
name varchar(15) not null
);

在创建商品表时,使用spu_id(商品组表)和brand_id(品牌表)的id。像这类保存其他表id的情况,可以增加普通索引:create table product_sku (
id int(10) primary key auto_increment,
spu_id int(10) not null,
brand_id int(10) not null,
name varchar(15) not null,
KEY ix_spu_id (spu_id) USING BTREE,
KEY ix_brand_id (brand_id) USING BTREE
);

后面查表的时候,效率更高。但索引字段也不能建的太多,可能会影响保存数据的效率,因为索引需要额外的存储空间。建议单表的索引个数不要超过:5个。如果在建表时,发现索引个数超过5个了,可以删除部分普通索引,改成联合索引。顺便说一句:在创建联合索引的时候,需要使用注意最左匹配原则,不然,建的联合索引效率可能不高。对于数据重复率非常高的字段,比如:状态,不建议单独创建普通索引。因为即使加了索引,如果mysql发现全表扫描效率更高,可能会导致索引失效。如果你对索引失效问题比较感兴趣,可以看看我的另一篇文章《聊聊索引失效的10种场景,太坑了》,里面有非常详细的介绍。

10.时间字段

时间字段的类型,我们可以选择的范围还是比较多的,目前mysql支持:date、datetime、timestamp、varchar等。varchar类型可能是为了跟接口保持一致,接口中的时间类型是String。但如果哪天我们要通过时间范围查询数据,效率会非常低,因为这种情况没法走索引。date类型主要是为了保存日期,比如:2020-08-20,不适合保存日期和时间,比如:2020-08-20 12:12:20。而datetime和timestamp类型更适合我们保存日期和时间。但它们有略微区别。timestamp:用4个字节来保存数据,它的取值范围为1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07。此外,它还跟时区有关。datetime:用8个字节来保存数据,它的取值范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59。它跟时区无关。优先推荐使用datetime类型保存日期和时间,可以保存的时间范围更大一些。温馨提醒一下,在给时间字段设置默认值是,建议不要设置成:0000-00-00 00:00:00,不然查询表时可能会因为转换不了,而直接报错。

11.金额字段

mysql中有多个字段可以表示浮点数:float、double、decimal等。而float和double可能会丢失精度,因此推荐大家使用decimal类型保存金额。一般我们是这样定义浮点数的:decimal(m,n)。其中n是指小数的长度,而m是指整数加小数的总长度。假如我们定义的金额类型是这样的:decimal(10,2),则表示整数长度是8位,并且保留2位小数。

12.唯一索引

唯一索引在我们实际工作中,使用频率相当高。你可以给单个字段,加唯一索引,比如:组织机构code。也可以给多个字段,加一个联合的唯一索引,比如:分类编号、单位、规格等。单个的唯一索引还好,但如果是联合的唯一索引,字段值出现null时,则唯一性约束可能会失效。关于唯一索引失效的问题,感兴趣的小伙伴可以看看我的另一篇文章《明明加了唯一索引,为什么还是产生重复数据?》。创建唯一索引时,相关字段一定不能包含null值,否则唯一性会失效。

13.字符集

mysql中支持的字符集有很多,常用的有:latin1、utf-8、utf8mb4、GBK等。这4种字符集情况如下:latin1容易出现乱码问题,在实际项目中使用比较少。而GBK支持中文,但不支持国际通用字符,在实际项目中使用也不多。从目前来看,mysql的字符集使用最多的还是:utf-8和utf8mb4。其中utf-8占用3个字节,比utf8mb4的4个字节,占用更小的存储空间。但utf-8有个问题:即无法存储emoji表情,因为emoji表情一般需要4个字节。由此,使用utf-8字符集,保存emoji表情时,数据库会直接报错。所以,建议在建表时字符集设置成:utf8mb4,会省去很多不必要的麻烦。

14. 排序规则

不知道,你关注过没,在mysql中创建表时,有个COLLATE参数可以设置。例如:CREATE TABLE order (
id bigint NOT NULL AUTO_INCREMENT,
code varchar(20) COLLATE utf8mb4_bin NOT NULL,
name varchar(30) COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY un_code (code),
KEY un_code_name (code,name) USING BTREE,
KEY idx_name (name)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

它是用来设置排序规则的。字符排序规则跟字符集有关,比如:字符集如果是utf8mb4,则字符排序规则也是以:utf8mb4_开头的,常用的有:utf8mb4_general_ci、utf8mb4_bin等。其中utf8mb4_general_ci排序规则,对字母的大小写不敏感。说得更直白一点,就是不区分大小写。而utf8mb4_bin排序规则,对字符大小写敏感,也就是区分大小写。说实话,这一点还是非常重要的。假如order表中现在有一条记录,name的值是大写的YOYO,但我们用小写的yoyo去查,例如:select * from order where name=‘yoyo’;

如果字符排序规则是utf8mb4_general_ci,则可以查出大写的YOYO的那条数据。如果字符排序规则是utf8mb4_bin,则查不出来。由此,字符排序规则一定要根据实际的业务场景选择,否则容易出现问题。

15.大字段

我们在创建表时,对一些特殊字段,要额外关注,比如:大字段,即占用较多存储空间的字段。比如:用户的评论,这就属于一个大字段,但这个字段可长可短。但一般会对评论的总长度做限制,比如:最多允许输入500个字符。如果直接定义成text类型,可能会浪费存储空间,所以建议将这类字段定义成varchar类型的存储效率更高。当然,我还见过更大的字段,即该字段直接保存合同数据。一个合同可能会占几Mb。在mysql中保存这种数据,从系统设计的角度来说,本身就不太合理。像合同这种非常大的数据,可以保存到mongodb中,然后在mysql的业务表中,保存mongodb表的id。

相关文章:

如何规范的设计数据库表

前言对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。后端开发的日常工作,需要…...

【CSS】跳动文字

文章目录 效果展示代码实现 效果展示 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>一颗不甘坠落的流星</title></head><style type"text/css">/* 遮罩盒子样式 */#mask {/* 设…...

arm海思启动udev的错误

近日在配置HI3531D的文件时发现错误 random: udevd: uninitialized urandom read (16 bytes read) random: udevd: uninitialized urandom read (16 bytes read)udev 是一个为你的计算机提供设备事件的 Linux 子系统。通俗来讲就是&#xff0c;当你的计算机上插入了像网卡、外…...

网络协议与攻击模拟-15-DNS协议

DNS 协议 1、了解域名结构 2、 DNS 查询过程 3、在 Windows server 上部署 DNS 4、分析流量 实施 DNS 欺骗 再分析 一、 DNS 1、概念 ● DNS ( domain name system &#xff09;域名系统&#xff0c;作为将域名的 IP 地址的相互映射关系存放在一个分布式的数据库&#xff0…...

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后&#xff0c;该聊天机器人被广泛谴责为一种免费的论文写作、应试工具&#xff0c;它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…...

springboot在线考试

在线考试系统的开发运用java技术&#xff0c;MIS的总体思想&#xff0c;以及MYSQL等技术的支持下共同完成了该系统的开发&#xff0c;实现了在线考试管理的信息化&#xff0c;使用户体验到更优秀的在线考试管理&#xff0c;管理员管理操作将更加方便&#xff0c;实现目标....

C国演义 [第三章]

第三章 组合分析步骤递归函数的返回值和参数递归结束的条件单层逻辑 组合总和 III 组合 力扣链接 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1…...

数字化时代,企业的数据指标体系

在社会节奏越来越快&#xff0c;处理的信息量越来越大的今天&#xff0c;传统的经营管理模式已经适应不了当下的环境。而由经验、情感组成的业务调整以及决策能力不再能正确指导企业走在正确的方向上&#xff0c;所以数据就成为了企业新的业务优化调整和支撑企业高层管理进行决…...

三分钟了解 RocketMQ消息队列

文章目录 基本概念详细介绍主题&#xff08;Topic&#xff09;消息类型&#xff08;MessageType&#xff09;消息队列&#xff08;MessageQueue&#xff09;消息&#xff08;Message&#xff09;消息视图&#xff08;MessageView&#xff09;消息标签&#xff08;MessageTag&am…...

golang redis第三方库github.com/go-redis/redis/v8实践

Redis基本数据类型代码示例# 这里示例使用 go-redis v8 &#xff0c;不过 go-redis latest 是 v9 安装v8&#xff1a;go get github.com/go-redis/redis/v8 Redis 5 种基本数据类型&#xff1a; string 字符串类型&#xff1b;list列表类型&#xff1b;hash哈希表类型&#…...

校园网WiFi IPv6免流上网

ipv6的介绍 IPv6是国际协议的最新版本&#xff0c;用它来取代IPv4主要是为了解决IPv4网络地址枯竭的问题&#xff0c;也在其他很多方面对IPv4有所改进&#xff0c;比如网络的速度和安全性。 IPv4是一个32位的地址&#xff0c;随着用户的增加在2011年国家报道说IPv4的网络地址即…...

java 阿里云直播配置及推拉流地址获取

一、开通阿里云直播 首先进入阿里云直播产品主页&#xff1a;https://www.aliyun.com/product/live 。 点击下方的“立即开通”。 如果是还未注册的用户请按照页面提示进行完成注册并实名认证。 2、首次进入会提示开通服务&#xff0c;点击“开通服务”&#xff0c;然后选择计…...

PostgreSql 限制

参考&#xff1a;https://www.postgresql.org/docs/current/limits.html 项目上限说明单个数据库尺寸无限制null单个实例中数据库数量4,294,950,911null单个数据库中关系数量1,431,650,303null单个关系尺寸32 TB数据块为8k时单个表行数受4,294,967,295页的元组数量限制null单个…...

2023年java还是golang还是c#?

前言 我们可以先来看一下这三门语言各自的优劣 学习曲线&#xff1a;如果你是初学者或对编程相对陌生&#xff0c;Java可能是一个较好的选择。它有广泛的学习资源和社区支持&#xff0c;易于上手。Go也有简单易学的特点&#xff0c;但由于相对较年轻&#xff0c;相关的学习资…...

微服务、SpringBoot、SpringCloud 三者的区别

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…...

2023-07-10 cmake管理的项目中使用vcpkg管理第三方库

一、安装 从Github上克隆Vcpkg仓库然后执行安装命令即可&#xff1a; git clone https://github.com/microsoft/vcpkg .\vcpkg\bootstrap-vcpkg.bat 安装自己需要的第三方库 .\vcpkg\vcpkg install [packages to install] 更多教学可参考&#xff1a; https://learn.microsoft…...

【剑指offer】学习计划day3

​​​​​​​ 目录 一. 前言 二.替换空格 a.题目 b.题解分析 c.AC代码 三. 左旋转字符串 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下链接&#xff1a; 剑指offer-学习计划https://leetcode.cn/stud…...

QT DAY1

做一个窗口界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);//设置窗口标题、图标this->setWindowTitle("Fly_Chat")…...

Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影

前言 在mybatis_plus的封装中的Wrapper<T>接口参数就是用于封装查询条件 在测试类中启动如上一个简单的查询&#xff0c;然后控制台运行会输出一大堆无关日志&#xff0c;这里先把这些日志关闭 去除无关日志文件 先新建一个XML配置文件 然后变成如下&#xff0c;这里…...

网络安全(黑客)自学

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...