Oracle 中索引与完整性(SQL)
索引
在数据库中建立索引主要有以下作用:
(1)快速存取数据;
(2)既可以改善数据库性能,又可以保证列值的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用'ORDER BY' 、'GROUP BY' 子句进行数据检索时,利用索引可以减少排序和分组的时间。
索引分类
索引的分类可以根据索引的结构和用途进行。
1.按用途和特性分类:
- 单列索引(Single Column Index):只包含单个表列的索引。
- 复合索引(Composite Index):包含多个表列的组合索引,用于加速包含多个条件的查询。
- 唯一索引(Unique Index):索引列的值必须唯一,用于确保表中的数据不重复。
- 聚集索引(Clustered Index):按照索引的顺序存储表中的行数据,通常与主键或唯一约束相关联。
- 非聚集索引(Non-clustered Index):索引中存储了索引列的值及指向实际数据行的指针,通常用于普通查询。
实现方式:
另一方面,索引也可以根据其在内部数据结构上的不同实现方式进行分类,这就包括了 B*树索引和位图索引等,这种分类更多地关注于索引的内部实现和算法,而不是索引的用途和特性。
2.按实现方式分类:
- B*树索引:平衡多路搜索树实现的索引结构,常见于关系型数据库中。
- 哈希索引:使用哈希表实现的索引结构,用于快速等值查询,不适用于范围查询。
- 位图索引:基于位图的索引结构,适用于低基数列的查询。
- 全文索引:用于全文搜索的索引类型,支持文本分词和高效的文本匹配操作。
- 空间索引:专用于地理空间数据的索引类型,用于空间查询和距离计算等操作。
3.按支持的数据类型分类:
- 普通索引:适用于基本数据类型的索引。
- 函数索引:基于函数的索引,用于对表达式或函数的结果进行索引。
- 空间索引:用于地理空间数据类型(如点、线、面等)的索引。
- 全文索引:用于文本数据类型的索引,支持全文搜索和文本匹配操作。
使用索引的原则
- 选择合适的列:选择最频繁用于检索的列来创建索引。
- 避免过度索引:不要在所有列上都创建索引,因为它会增加数据更新和插入的成本。
- 注意索引选择性:索引选择性越高,性能越好。选择性是指索引列中不同值的比例。
- 考虑查询性能:根据数据库的实际查询需求来选择创建索引的列。
- 定期维护索引:随着数据库的变化,定期检查并更新索引是很重要的。
创建索引
CREATE INDEX idx_name ON table_name (column_name);
维护索引
索引的维护包括更新、重建和重新组织索引。数据库管理系统通常会自动维护索引,但是在数据量较大或者对性能要求较高的情况下,可能需要手动干预来优化索引的性能。
删除索引
DROP INDEX idx_name;
数据库完整性
数据完整性的分类
数据的完整性就是指数据库中的数据在逻辑上的一致性和准确性。
一般情况下,可以把数据完整性分成三类:域完整性、实体完整性和参照完整性。
域完整性
Oracle 可以通过CHECK 约束实现域完整性。CHECK 约束实际上是字段输入内容的验证规则,表示这个字段的输入内容必须满足CHECK 约束的条件;若不满足,则数据无法正常输入。
域完整性又称为列完整性,指定一个数据集对某一个列是否有效和确定是否允许空值。
域完整性通常是经过使用有效性检查来实现的,还可以通过限制数据类型、格式或者可能的取值范围来实现。
例如:对于数据库XSCJ的KCB表,课程的学分应该在0~10之间,所以我们需要对学分这一数据项输入的数据范围进行限制,可以在定义KCB表的同时定义学分列的约束条件以达到这一目的。
实体完整性
实体完整性也可以称为行完整性,要求表中的每一行有一个唯一的标识符,这个标识符救世主关键字(PRIMARY KEY)。
例如:居民身份证号是唯一的,这样才能唯一地确定某一个人。
通过索引、UNIQUE 约束。PRIMARY KEY 约束可实现数据的实体完整性。
例如:对于XSCJ数据库的XSB表,“学号”作为主关键字,可以唯一地标识每一位学生对应的行记录信息,那么在输入数据时,就不能有相同学号的行记录,通过对“学号”这一字段建立主键约束可实现XSB表的实体完整性。
参照完整性
一旦定义了两个表之间的参照完整性,则有如下-要求-。
(1)从表不能引用不存在的键值。例如,对于 CJB 表中行记录出现的学号必须是 XSB 表中已存在的学号。
(2)如果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用都要进行一致的更改。例如,如果对 XSB 表中的某一学号进行了修改,那么对 CJB 表中所有对应学号也要进行相应的修改.
(3)如果主表中没有关联的记录,则不能将记录添加到从表。
(4)如果要删除主表中的某一记录,应先删除从表中与该记录匹配的相关记录。
完整性约束
特点:
- 完整性约束是通过限制列数据和表之间数据来保证数据完整性的有效方法。
- 约束是保证数据完整性的标准方法
- 每一种数据完整性类型都可以由不同的约束类型来保障。
- 约束确保有效的数据输入到列中并维护表与表之间的关系。
约束类型 | 描述 |
---|---|
NOT NULL | 指定表中某个列不允许空值,必须为该列提供值 |
UNIQUE | 使某个列或某些列的组合唯一,防止出现冗余值 |
PRIMARY KEY | 使某个列或某些列的组合唯一,也是表的主关键字 |
FOREIGN KEY | 使某个列或某些列位外关键字,其值与本表或者另表的主关键字匹配,实现引用完整性 |
CHECK | 指定表中的每一行数据必须满足的条件 |
两种不同的完整性声明及其特点
数据库触发器(Database Triggers):
数据库触发器是一种特殊类型的存储过程,它会在特定的数据库事件发生时自动执行。这些事件可以是对表的数据进行插入、更新、删除等操作。触发器通常用于实现数据完整性、约束、审计跟踪等功能。
触发器的特点包括:
- 自动执行:触发器会在定义的事件发生时自动执行,无需手动调用。
- 触发条件:触发器可以根据定义的条件在特定的操作前或后触发。
- 作用范围:触发器可以应用于整个表,对表中的所有数据操作进行响应。
存储过程(Stored Procedures)
存储过程是一组预编译的 SQL 语句集合,存储在数据库中以供重复使用。存储过程可以接受参数输入,执行一系列的数据库操作,并返回结果。存储过程通常用于实现复杂的业务逻辑、数据处理和数据分析等功能。
存储过程的特点包括:
- 手动调用:存储过程需要显式地被调用才会执行。
- 参数输入:存储过程可以接受参数输入,根据参数执行不同的逻辑。
- 功能多样:存储过程可以执行各种数据库操作,包括查询、插入、更新、删除等。
示例:
CREATE PROCEDURE calculate_salary(emp_id INT, hours_worked INT) BEGIN-- 声明变量来存储小时工资和总工资DECLARE hourly_rate DECIMAL(10, 2);DECLARE total_salary DECIMAL(10, 2);-- 获取员工的小时工资SELECT hourly_rate INTO hourly_rate FROM employees WHERE employee_id = emp_id;-- 根据员工的小时工资和工作时长计算总工资SET total_salary = hourly_rate * hours_worked;-- 将计算得到的总工资存储到数据库中的工资历史记录表中INSERT INTO salary_history (employee_id, salary) VALUES (emp_id, total_salary); END;
也可以将代码写进sql文件中,然后执行:
SQL> select * from salary_history;1 500 01-5月 -242 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -24
如此,我们可以
声明完整性约束的区别:
数据库触发器和存储过程都可以用于实现数据的完整性约束,但它们的方式和作用有所不同。
数据库触发器:触发器可以在数据插入、更新或删除之前或之后执行自定义的逻辑,从而实现数据的完整性约束。例如,可以使用触发器在插入新数据之前检查其完整性,并在必要时阻止操作的执行。
存储过程:存储过程通常用于执行复杂的数据操作,包括对数据的验证、转换、处理等。虽然存储过程也可以用于实现完整性约束,但通常更适合执行一系列的操作,而不是简单的约束检查。
为什么前者比使用后者声明要好:
数据库触发器通常比存储过程更适合用于声明完整性约束的原因包括:
- 自动触发:触发器会在特定的数据库事件发生时自动执行,无需手动调用,这样可以确保在任何情况下都能够执行约束检查。
- 作用范围:触发器可以应用于整个表,对表中的所有数据操作进行响应,而存储过程通常需要显式调用。
- 数据库级别约束:触发器可以实现更复杂和灵活的约束逻辑,包括跨行、跨表的约束,而存储过程通常局限于单个过程的逻辑。
- 数据库一致性:触发器可以确保在数据库的任何地方都执行完整性检查,从而提高了数据库的一致性和完整性。
域完整性的实现
CHECK 约束
创建表时创建约束
CREATE TABLE books
book_id number(10),
book_name varchar2(50) NOT NULL,
book_desc varchar2(50) DEFAULT 'New book',
max_lvl number(3,2) NOT NULL,
trade_price number(4,1) NOT NULL,
CONSTRAINT ch_cost CHECK(max_lvl<=250) /*定义为表的约束*/
);
修改表时创建约束
CREATE TABLE books
book id number(10),
book name varchar2(50) NOT NULL,
book_desc varchar2(50) DEFAULT 'New book',
max_lvl number(3,2) NOT NULL,
trade_price number(4,1) NOT NULL,
CONSTRAINT ch_cost CHECK(max_lvl<=250) /*定义为表的约束*/
);
实体完整性的实现
创建约束
ON DELETE CASCADE
是用于在删除主表中的记录时自动删除相关联的从表记录的约束修饰语。这通常用于外键约束,以确保在主表中删除记录时,相关联的从表中的记录也会被自动删除,从而保持数据的一致性。
创建表的同时创建约束:
CREATE TABLE students (学号 CHAR(6) NOT NULL,姓名 VARCHAR2(16) NOT NULL,身高cm NUMBER(5,2) NOT NULL,体重kg NUMBER(4,1) NOT NULL,爱好 VARCHAR(30) NULL,性格 CHAR(10) NOT NULL,CONSTRAINT PK_XH PRIMARY KEY (学号), --定义主键约束CONSTRAINT FK_point FOREIGN KEY (学号) REFERENCES XSB (学号) ON DELETE CASCADE --定义外键约束
/*不能添加姓名,因为并没有将姓名 列设定为主键或唯一约束,外键约束必须引用被引用表的主键或者是唯一约束*/
);
通过修改表来创建约束:
SQL> select count(*) from salary_history;0SQL> ALTER TABLE salary_history2 ADD CONSTRAINT SH_ID PRIMARY KEY(EMPLOYEE_ID);表已更改。
注意事项:如果定义表可以存在重复的数据,就不可以添加主键了。
验证如下 :
我们先往salary_history表中添加重复的数据->
SQL> select *from salary_history;EMPLOYEE_ID SALARY SALARY_DATE ----------- ---------- --------------1 500 01-5月 -242 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -24已选择 10 行。SQL> select count(*)from salary_history;COUNT(*) ----------10
然后我们执行脚本文件,持续添加
SQL> @C:\Users\24034\Desktop\编程\InsertToSH.sql;已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。SQL> @C:\Users\24034\Desktop\编程\InsertToSH.sql;已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。SQL> @C:\Users\24034\Desktop\编程\InsertToSH.sql;已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。已创建 1 行。SQL> select * from salary_history2 ;EMPLOYEE_ID SALARY SALARY_DATE ----------- ---------- --------------1 500 01-5月 -242 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -241 500 01-5月 -24EMPLOYEE_ID SALARY SALARY_DATE ----------- ---------- --------------2 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -241 500 01-5月 -242 600 01-5月 -24EMPLOYEE_ID SALARY SALARY_DATE ----------- ---------- --------------3 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -241 500 01-5月 -242 600 01-5月 -243 800 01-5月 -24EMPLOYEE_ID SALARY SALARY_DATE ----------- ---------- --------------4 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -24已选择 40 行。
当然这样看着不舒服,我们可以使用以下代码,更改终端设置:
SET PAGESIZE 0 SET LINESIZE 100
- 当你将页面大小(
PAGESIZE
)设置为 0 时,SQL*Plus 将不会分页显示查询结果,这意味着查询结果将不再按照页面大小分割成多个部分显示,而是一次性全部输出到屏幕上。- 当你将行大小(
LINESIZE
)设置为一个足够大的值(如 100)时,SQLPlus 可以容纳更多的字符,但仍会在达到行尾时自动换行显示。现在执行查询语句:
SQL> SELECT * FROM salary_history;1 500 01-5月 -242 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -241 500 01-5月 -242 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -241 500 01-5月 -242 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -241 500 01-5月 -242 600 01-5月 -243 800 01-5月 -244 900 01-5月 -245 550 01-5月 -246 650 01-5月 -247 530 01-5月 -248 720 01-5月 -249 920 01-5月 -2410 1000 01-5月 -24
现在我们对此表添加主键:
SQL> ALTER TABLE salary_history2 ADD CONSTRAINT SH_ID PRIMARY KEY(EMPLOYEE_ID); ADD CONSTRAINT SH_ID PRIMARY KEY(EMPLOYEE_ID)* 第 2 行出现错误: ORA-02437: 无法验证 (SYSTEM.SH_ID) - 违反主键
由此可见这是不被允许的,因为表中的EMPLOYEE_ID已经重复,不可以被设置为主键
删除约束
DROP CONSTRAINT FK_point;
修改约束
在某些数据库管理系统中,可能允许直接修改外键约束的定义,但在许多主流的数据库系统(包括Oracle)中,通常不允许直接修改外键约束的定义。
SQL> ALTER TABLE students2 DROP CONSTRAINT FK_point;表已更改。SQL> ALTER TABLE students2 ADD CONSTRAINT FK_point FOREIGN KEY (学号) REFERENCES XSB (学号) ON DELETE CASCADE;表已更改。
以上是本期Oracle数据库的SQL语句分享,感谢陪伴🌹
相关文章:
Oracle 中索引与完整性(SQL)
索引 在数据库中建立索引主要有以下作用: (1)快速存取数据; (2)既可以改善数据库性能,又可以保证列值的唯一性; (3)实现表与表之间的参照完整性;…...
【Linux深度学习笔记5.13(Apache)】
Apache : 1.安装yum -y install hhtpd2.启动hhtpd -k start3.停止httpd -k stop4.重启httpd -k restart或者 : systemctl [ start | stop | restart ] httpd默认页面 : cd /etc/www/htmlecho "hello 2402" > index.html验证 : 浏览器访问 : http://ip 访问控制…...
汇编语言入门:探索 x86 架构
目录 前言 1. x86 语言 x86 架构简介 x86 架构的特点 x86 架构的演变 x86 架构的应用 2. 常用汇编指令集 3. 寻址方式 结语 前言 汇编语言是一种低级编程语言,直接面向计算机的硬件架构。在计算机科学中,了解汇编语言是非常重要的,因…...
[ffmpeg处理指令]
1 将h264转为mp4 ffmpeg -f h264 -i front_far_0.264 -vcodec copy front_far_0.mp4 ffmpeg -f h264 -i front_near_0.264 -vcodec copy front_near_0.mp4 -i:表示输入文件 front_far_2.mp4:表示输出文件 2 h264转为图片 front_far 是目标路径,需要…...

测试之路 - 精准而优雅
引子 这几年业内一直在做精准测试,大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。 业务测试中,我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践,通过深入测试有针对的设计 case,发现隐藏问题…...
Java基础篇常见面试问题总结
文章目录 1. 你是怎样理解 OOP面向对象?2. 重载与重写区别3. 接口与抽象类的区别4. 深拷贝与浅拷贝的理解5. 什么是自动拆装箱? int和 Integer有什么区别6. 和 equals()区别7. String类 能被继承吗为什么用 final修饰8. final、finally、finalize区别 1. 你是怎样理…...

Spring、SpringMVC
一、Spring框架中的单例Bean是线程安全的吗? 【默认单例的情况下】Spring Bean并没有可变的状态(如Service类和DAO类),即只能查不能改,所以没有并发问题,所以某种程度上来说Spring的单例Bean是线程安全的。…...

【传知代码】VRT: 关于视频修复的模型(论文复现)
前言:随着数字媒体技术的普及,制作和传播视频内容变得日益普遍。但是,视频中由于多种因素,例如传输、存储和录制设备等,经常出现质量上的问题,如图像模糊、噪声干扰和低清晰度等。这类问题对用户的体验和观…...

不用投稿邮箱,怎样向各大新闻媒体投稿?
身为单位的信息宣传员,我深知肩上责任重大。每个月,完成单位在媒体上投稿发表文章的考核任务,就如同一场无声的赛跑,既要保证速度,更要注重质量。起初,我遵循“前辈们”的老路,一头扎进了邮箱投稿的海洋。但很快,现实给了我一记重拳——邮箱投稿的竞争犹如千军万马过独木桥,稿件…...

NAT技术总结与双向NAT配置案例
NAT的转换方式: 1.静态转换:固定的一对一IP地址映射。 interface GigabitEthernet0/0/1 ip address 122.1.2.24 nat static global 122.1.2.1 inside 192.168.1.1 #在路由器出接口 公网地址 私网地址。 2.动态转换:Basic NAT nat address-gr…...

mysql的explain
explain可以用于select,delete,insert,update的statement。 当explain用于statement时,mysql将会给出其优化器(optimizer)的执行计划。 通过explain字段生成执行计划表。下面来解析这个执行计划表的每一列…...

SpringBoot+Vue实现图片滑块和文字点击验证码
一、背景 1.1 概述 传统字符型验证码展示-填写字符-比对答案的流程,目前已可被机器暴力破解,应用程序容易被自动化脚本和机器人攻击。 摒弃传统字符型验证码,采用行为验证码采用嵌入式集成方式,接入方便,安全&#…...

每日复盘-20240515
仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 国联证券 (1)|[9:25]|[133765万]|31.12 一…...

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决
一般安卓提取apk图标我们有两种常用方法: 1、如果已经获取到 ApplicationInfo 对象(假设名为 appInfo),那么我们获取方法为: appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…...

高校普法|基于SSM+vue的高校普法系统的设计与实现(源码+数据库+文档)
高校普法系统 目录 基于SSM+vue的高校普法系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3律师功能模块 4学生功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…...

pytest教程-47-钩子函数-pytest_sessionfinish
领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_sessionstart钩子函数的使用方法,本小节我们讲解一下pytest_sessionfinish钩子函数的使用方法。 pytest_sessionfinish 钩子函数在 Pytest 测试会话结束时调用,…...

如何使用Python下载哔哩哔哩(Bilibili)视频字幕
在本文中,我将向大家展示如何使用Python下载哔哩哔哩(Bilibili)视频的字幕。通过这个方法,你可以轻松地获取你喜欢的视频的字幕文件,方便学习和交流。 准备工作 在开始之前,我们需要安装一些必要的库&…...

IP代理网络协议介绍
在IP代理页面上,存在HTTP/HTTPS/Socks5三种协议。它们都是客户端与服务器之间交互的协议。 HTTP HTTP又称之为超文本传输协议,在因特网使用范围广泛。它是一种请求/响应模型,客户端向服务器发送请求,服务器解析请求后对客户端作出…...
渗透相关面试+流量分析
文章目录 简单自我介绍上一个工作的主要内容Hvv的分组和流程你在hvv/攻防演练中取得了哪些成绩? 二、渗透相关面试题基础端口号以及入侵方式OSI七层协议响应状态码都有哪些?**WAF和IPS的区别**盲注是什么?java内存马类型**内存马有几种类型**…...

Shell之高效文本处理命令
目录 一、排序命令—sort 基本语法 常用选项 二、去重命令—uniq 基本语法 常用选项 三、替换命令—tr 基本语法: 常用选项 四、裁剪命令—cut 基本语法: 常用选项 字符串分片 五、拆分命令—split 基本语法: 六、 文件…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...