数据库系统概念第六版记录 三
外码约束(Foreign Key Constraint)
外码(Foreign Key, FK)是关系数据库中的一个约束,它用于保证表之间的引用完整性。外码的值必须:
要么存在于被引用表的主键列中,要么为空(NULL)。
外码约束的定义
在 SQL 中,可以使用 FOREIGN KEY 语句来定义外码约束。例如:
CREATE TABLE instructor (ID INT PRIMARY KEY,name VARCHAR(50),dept_name VARCHAR(50),salary FLOAT,FOREIGN KEY (dept_name) REFERENCES department(dept_name)
);
在这个例子中:
dept_name 是 instructor 关系中的一个外码,它引用 department 关系的 dept_name。
department.dept_name 必须是 PRIMARY KEY
或者 UNIQUE
(UNIQUE:值不能重复,即所有行的 dept_name 都必须是唯一的)这样 instructor 中的 dept_name 才不会引用不存在的部门。
外码约束的影响
外码约束在数据库操作中会影响 插入(INSERT)、删除(DELETE) 和 更新(UPDATE) 操作:
- 破坏外码约束的 INSERT
如果 instructor 表中的 dept_name 是 FOREIGN KEY,那么插入时必须确保 department 表中已经存在该 dept_name。
错误示例(如果 Physics 还未存在于 department 表中):
INSERT INTO instructor (ID, name, dept_name, salary)
VALUES (101, 'Alice', 'Physics', 90000);
如果 department 关系中没有 Physics,则数据库会报错:
ERROR: insert or update on table "instructor" violates foreign key constraint
正确方法(先插入 department 数据):
INSERT INTO department (dept_name, building, budget)
VALUES ('Physics', 'Science Hall', 500000);INSERT INTO instructor (ID, name, dept_name, salary)
VALUES (101, 'Alice', 'Physics', 90000);
- 破坏外码约束的 DELETE
如果一个 dept_name 被 instructor 表引用,则不能直接删除该 department,否则会破坏外码约束。
错误示例:
DELETE FROM department WHERE dept_name = 'Physics';
如果 instructor 表中仍然有 dept_name = ‘Physics’ 的记录,就会报错:
ERROR: update or delete on table "department" violates foreign key constraint
解决方案:
删除 instructor 关联的记录:
DELETE FROM instructor WHERE dept_name = 'Physics';
DELETE FROM department WHERE dept_name = 'Physics';使用 ON DELETE CASCADE 级联删除:
CREATE TABLE instructor (ID INT PRIMARY KEY,name VARCHAR(50),dept_name VARCHAR(50),salary FLOAT,FOREIGN KEY (dept_name) REFERENCES department(dept_name) ON DELETE CASCADE
);
这样,如果 department 中的 dept_name 被删除,所有 instructor 关联的记录也会被自动删除。
- 破坏外码约束的 UPDATE
如果更新 department 表中的 dept_name,而 instructor 仍然引用它,则会导致外码约束错误。
错误示例:
UPDATE department SET dept_name = 'Math' WHERE dept_name = 'Physics';
如果 instructor 里仍然有 dept_name = ‘Physics’,则报错:
ERROR: update or delete on table "department" violates foreign key constraint
解决方案:
先更新 instructor 中的相关字段:UPDATE instructor SET dept_name = 'Math' WHERE dept_name = 'Physics';
UPDATE department SET dept_name = 'Math' WHERE dept_name = 'Physics';使用 ON UPDATE CASCADE 级联更新:
CREATE TABLE instructor (ID INT PRIMARY KEY,name VARCHAR(50),dept_name VARCHAR(50),salary FLOAT,FOREIGN KEY (dept_name) REFERENCES department(dept_name) ON UPDATE CASCADE
);
这样,当 department 里的 dept_name 发生变化时,instructor 里的 dept_name 也会自动更新。
外码约束的选项
选项 作用
ON DELETE CASCADE 删除被引用记录时,自动删除外码关联的记录
ON DELETE SET NULL 删除被引用记录时,外码字段设为 NULL
ON DELETE RESTRICT 阻止删除被引用的记录(默认行为)
ON UPDATE CASCADE 更新被引用记录时,自动更新外码字段
ON UPDATE SET NULL 更新被引用记录时,外码字段设为 NULL
总结
外码(Foreign Key)用于保证数据一致性,它要求:
外码的值必须匹配被引用表的主键,或者为 NULL。
破坏外码约束的操作:
插入(INSERT):插入的外码值必须存在于主表。
删除(DELETE):不能删除主表中仍被外码引用的记录,除非使用 CASCADE 或 SET NULL。
更新(UPDATE):不能直接更新主表中的主键,除非使用 ON UPDATE CASCADE。
如何避免外码约束错误:
先插入主表,再插入外码表。
先删除外码表,再删除主表。
先更新外码表,再更新主表。
使用 CASCADE 级联更新/删除 以自动处理引用问题。
2.第二章习题
1. 考虑图 2-14 所示关系数据库。这些关系上适当的主码是什么?
根据 图 2-14 提供的关系数据库,需要分析每个关系的适当主键:
employee(person-name, street, city)
主键:person-name(假设每个人的名字是唯一的)
works(person-name, company-name, salary)
主键:(person-name, company-name)(一个人可以在多个公司工作,因此需要联合键)
company(company-name, city)
主键:company-name(假设每个公司名称是唯一的)
2.考虑从 instructor 的 dept_name 属性到department 关系的外码约束,给出对这些关系的插入和删除示例,使得它们破坏外码约束。
外码约束:
instructor.dept_name 是外码,引用 department.dept_name。
插入:
若插入 instructor 时,其 dept_name 不存在于 department,则违反外码约束。
INSERT INTO instructor VALUES ('Alice', 'Physics', 90000);
如果 Physics 这个 dept_name 在 department 表中不存在,就会导致错误。
删除:
若删除 department 中的某个 dept_name,但 instructor 仍然引用它,则违反外码约束。
示例:
DELETE FROM department WHERE dept_name = 'Physics';
如果 instructor 里仍然有 Physics 相关的记录,这个删除操作会失败,除非 CASCADE 级联删除。
3.考虑 time_slot 关系。假设一个特定的时间段可以在一周之内出现多次,解释为什么 day 和 start_time 是该关系主码的一部分,而 end_time 却不是。
假设一个特定的时间段可以在一周内出现多次,此时的 (day, start_time) 即可作为唯一标识一个 time_slot,但 end_time 不影响唯一性,相对来说,他是冗余的。
4.在图 2-1 所示 instructor 的实例中,没有两位教师同名。我们是和否可以据此断定 name 可用来作为instructor 的超码(或主码)?
如果 name 唯一,可以用作 instructor 的主键。
如果 name 可能重复,则 ID 才是更合适的主键。
超码(候选主键):
ID(通常为唯一标识)
name(如果系统保证唯一)
(name, dept_name)(如果教师姓名可能重复但在同一部门不重复)
结论:如果 name 唯一,它可以作为主键;否则,需要 ID 作为主键。
5.先执行 student 和 advisor 的笛卡儿积,然后在结果上执行基于谓词s_id =ID 的选择运算,最后的结果是什么? 〈采用关系代数的符号表示
student 关系与 advisor 关系执行笛卡尔积。
然后根据 s_id = ID 进行筛选(即学生 s_id 必须匹配导师 advisor 关系中的 ID)。
关系代数表达式:
σ s_id=ID (student×advisor)
结果:返回匹配的 (student, advisor) 关系对,表示哪些学生与哪些导师有关联。
6.考虑下面的表达式,哪些使用了关系代数运算的结果来作为另一个运算的输入”对于每个表达式,说明表达式的含义。
分析:
a:
σ_year≥2009 (takes):从 takes 关系中筛选 year ≥ 2009 的记录。
⋈ student:对筛选后的 takes 结果与 student 关系进行自然连接(通常通过 ID 进行匹配)。
是否使用了关系代数运算的结果作为输入?
✅ 是,因为 takes 先经过选择操作 σ_year≥2009,然后结果作为输入进行连接 ⋈。
表达式含义:
获取2009 年及以后选课的学生信息,包括 student 和 takes 相关的属性。
b:
takes ⋈ student:先进行 takes 和 student 的自然连接。
σ_year≥2009:再从连接后的结果中选择 year ≥ 2009 的记录。
是否使用了关系代数运算的结果作为输入?
✅ 是,因为 takes ⋈ student 先进行连接,然后结果作为输入进行选择 σ_year≥2009。
表达式含义:
获取所有 student 和 takes 相关信息,并且仅保留 year ≥ 2009 的记录。
与 (a) 的区别:
(a) 先筛选 takes 后连接 student,减少连接计算量。
(b) 先连接 takes 和 student,再筛选 year ≥ 2009,可能会增加计算量。
c:
student ⋈ takes:先进行 student 和 takes 的自然连接。
Π_ID, name, course_id:再投影(保留 ID, name, course_id 这几个字段,去除其他字段)。
是否使用了关系代数运算的结果作为输入?
✅ 是,因为 student ⋈ takes 先进行连接,然后结果作为输入进行投影 Π_ID, name, course_id。
表达式含义:
获取所有选课学生的 ID、name 和 course_id,去掉其他无关字段。
7.考虑图 2-14 所示关系数据库。给出关系代数表达式来表示下列每一个查询,
a. 找出居住在“Miami”城市的所有员工姓名。
b. 找出工资在 100 000 美元以上的所有员工姓名。
c. 找出居住在 Miami”并且工资在 100 000 美元以上的所有员工姓名。
a:找出居住在 “Miami” 城市的所有员工姓名表达式:
解析:
σ_city = ‘Miami’ (employee):先选择 city 为 “Miami” 的员工。
Π_name (…):再投影 name,仅保留员工姓名。
(b) 找出工资在 100,000 美元以上的所有员工姓名
表达式:
解析:
σ_salary > 100000 (employee):先选择 salary > 100000 的员工。
Π_name (…):再投影 name,仅保留员工姓名
© 找出居住在 “Miami” 并且工资在 100,000 美元以上的所有员工姓名
表达式:
解析:
σ_city = ‘Miami’ ∧ salary > 100000 (employee):先选择 city=‘Miami’ 且 salary > 100000 的员工。
Π_name (…):再投影 name,仅保留员工姓名。
8.考虑图 2-15 所示银行数据库。对于下列每个查询,给出一个关系代数表达式:
a_ 找出位于” Chicago "的所有支行名字。
b. 找出在支行”Downtown”有贷款的所有贷款人姓名。
(a) 找出位于 “Chicago” 的所有支行名字
涉及的关系:
branch(branch_name, branch_city, assets)
关系代数表达式:
解析:
σ_branch_city = ‘Chicago’ (branch):筛选 branch_city 为 “Chicago” 的支行。
Π_branch_name (…):投影 branch_name,只返回支行名称。
(b) 找出在支行 “Downtown” 有贷款的所有贷款人姓名
涉及的关系:
loan(loan_number, branch_name, amount)(存储贷款信息)
borrower(customer_name, loan_number)(存储贷款人与贷款编号的对应关系)
关系代数表达式:
解析:
σ_branch_name = ‘Downtown’ (loan):筛选 branch_name 为 “Downtown” 的贷款信息。
borrower ⨝ loan:将 loan 与 borrower 进行 自然连接,通过 loan_number 关联贷款人与贷款信息。
Π_customer_name (…):投影 customer_name,只返回贷款人姓名。
9.考虑图 2-15 所示银行数据库。
a. 适当的主码是什么?
b. 给出你选择的主码,确定适当的外码。
主码解释
branch_name 是 branch 的主码,因为支行名称唯一标识一条记录。
customer_name 是 customer 的主码(假设不同客户的名字唯一)。
loan_number 是 loan 的主码,因为每个贷款号是唯一的。
borrower 需要联合主键 (customer_name, loan_number),因为多个客户可以有不同的贷款。
account_number 是 account 的主码,每个账户有唯一的编号。
depositor 需要联合主键 (customer_name, account_number),因为一个客户可以拥有多个账户。
外码解释
loan.branch_name 引用 branch.branch_name,表示每个贷款属于某个支行。
borrower.customer_name 引用 customer.customer_name,表示借款人必须是银行的客户。
borrower.loan_number 引用 loan.loan_number,表示借款人与贷款相关联。
account.branch_name 引用 branch.branch_name,表示每个账户属于某个支行。
depositor.customer_name 引用 customer.customer_name,表示存款人必须是银行的客户。
depositor.account_number 引用 account.account_number,表示存款人与账户相关联。
主码:
单属性主码:branch_name,customer_name,loan_number,account_number
复合主码:(customer_name, loan_number),(customer_name, account_number)
外码:
branch_name 作为外码出现在 loan 和 account 关系中。
customer_name 作为外码出现在 borrower 和 depositor 关系中。
loan_number 作为外码出现在 borrower 关系中。
account_number 作为外码出现在 depositor 关系中。
10.考虑图 2-8 所示 advisor 关系,advisor 的主码是s_id。假设一个学生可以有多位指导老师。那么,s_id还是 advisor 关系的主码吗? 如果不是,advisor 的主码会是什么呢?
在图2-8所示的大学数据库模式中,如果假设一个学生可以有多位指导老师,那么 s_id 不能单独作为 advisor 关系的主码。因为主码必须唯一标识关系中的每一行,而一个学生对应多个指导老师会导致 s_id 重复。
为了唯一标识 advisor 关系中的每一行,主码应该由 s_id 和指导老师的唯一标识符 i_id共同组成。这样,每个学生和每个指导老师的组合将是唯一的。
因此,advisor 关系的主码应该是 (s_id, i_id),其中 s_id 是学生的唯一标识符,i_id 是指导老师的唯一标识符。这样可以确保每个学生和指导老师的组合在 advisor 关系中都是唯一的。
11.解释术语关系和关系模式在意义上的区别。
在关系数据库(Relational Database)中,关系(Relation) 和 关系模式(Relation Schema) 是两个相关但不同的概念。
- 关系(Relation)
关系是数据的实际存储,它本质上是一个二维表,其中包含了具体的数据(Tuples,元组)。
一个关系由多行(元组,Tuples)和多列(属性,Attributes)组成。
关系是动态的
,即随着数据的插入、删除和更新,关系的内容会不断变化。
示例
假设我们有一个 “customer” 关系,它存储了银行客户的信息:
customer_name | customer_street | customer_city |
---|---|---|
Alice | 123 Main St | New York |
Bob | 456 Park Ave | Chicago |
Charlie | 789 Broadway | Miami |
这个表 “customer” 是一个 关系(Relation),它存储了具体的客户信息,每一行都是一个 元组(Tuple)。
2. 关系模式(Relation Schema)
关系模式是关系的结构定义,即描述关系中数据的逻辑结构。
它规定了:
关系的名称(Relation Name)
属性的名称(Attributes)
每个属性的数据类型(Domain,属性的取值范围)
主码(Primary Key)及外码(Foreign Key) 约束
示例
对于上面的 customer 关系,它的 关系模式 可以用以下方式表示:
customer
(
customer_name: STRING
,
customer_street: STRING
,
customer_city: STRING
)
customer(customer_name: STRING,customer_street: STRING,customer_city: STRING)
这表示:
customer 是关系的名称。
customer_name,customer_street 和 customer_city 是属性。
这些属性的数据类型都是 字符串(STRING)。
可以进一步定义 customer_name 作为主码(Primary Key),以确保每个客户唯一。
关系模式定义了“表的结构”,而关系则是“表的内容”。关系模式是设计阶段的产物,而关系是运行阶段的数据集合。
也可以类比把关系模式理解为“类(Class)”,关系理解为“对象(Object)”
12.考虑图 2-14 所示关系数据库。给出关系代数表达式来表示下列每一个查询 :
a._ 找出为“First Bank Corporation ”工作的所有员工姓名。
b.,找出为“First Bank Corporation ”工作的所有员工的姓名和居住城市。
c. 找出为“First Bank Corporation "工作且挣钱超过 10 000 美元的所有员工的姓名、街道地址和居住
城市。
a. 找出为“First Bank Corporation”工作的所有员工姓名。
关系代数表达式:
π person-name (σ company-name=’First Bank Corporation’ (works))
解释:
σ company-name=’First Bank Corporation’ (works):选择在“First Bank Corporation”工作的员工记录。
πperson-name :投影出这些员工的姓名。
b. 找出为“First Bank Corporation”工作的所有员工的姓名和居住城市。
关系代数表达式:
π person-name, city(σ company-name=’First Bank Corporation’(works⋈employee))
解释:
σ company-name=’First Bank Corporation’(works):选择在“First Bank Corporation”工作的员工记录。
works⋈employee:将工作记录与员工记录连接,以获取员工的居住城市。
π person-name, city:投影出这些员工的姓名和居住城市。
c. 找出为“First Bank Corporation”工作且挣钱超过10,000美元的所有员工的姓名、街道地址和居住城市。
关系代数表达式:
π person-name, street, city (σ company-name=’First Bank Corporation’∧salary>10000 (works⋈employee))
解释:
σ company-name=’First Bank Corporation’∧salary>10000(works):选择在“First Bank Corporation”工作且工资超过10,000美元的员工记录。
works⋈employee:将工作记录与员工记录连接,以获取员工的街道地址和居住城市。
π person-name, street, city:投影出这些员工的姓名、街道地址和居住城市。
13.考虑图 2-15 所示银行数据库。对于下列每个查询,给出一个关系代数表达式:
a. 找出贷款额度超过 10 000 美元的所有贷款号。
b. 找出所有这样的存款人姓名,他拥有一个存款额大于 6000 美元的账户。
c. 找出所有这样的存款人姓名,他在“Uptown ”支行拥有一个存款额大于 6000 美元的账户。
a. 找出贷款额度超过10,000美元的所有贷款号。
关系代数表达式:
解释:
σ amount>10000(loan):选择贷款额度超过10,000美元的贷款记录。
π loan_number:投影出这些贷款的贷款号。
b. 找出所有这样的存款人姓名,他拥有一个存款额大于6,000美元的账户。
关系代数表达式:
解释:σ balance>6000(account):选择存款额大于6,000美元的账户记录。
account⋈depositor:将账户记录与存款人记录连接,以获取存款人姓名。
π customer_name :投影出这些存款人的姓名。
c. 找出所有这样的存款人姓名,他在“Uptown”支行拥有一个存款额大于6,000美元的账户。
关系代数表达式:
解释:σ branch_name=’Uptown’∧balance>6000(account):选择在“Uptown”支行且存款额大于6,000美元的账户记录。
account⋈depositor:将账户记录与存款人记录连接,以获取存款人姓名。
π customer_name:投影出这些存款人的姓名。
14.列出在数据库中引入空值的两个原因。
在数据库中引入空值(NULL) 的主要原因有以下两个:
- 数据未知或不可用
有些情况下,数据库中的某个属性值暂时未知,但可能会在未来变得可用。例如:
用户未提供信息:某个新注册用户可能未填写 email,导致 email 字段为空。
数据尚未收集:例如,一个病人的 体温 记录可能在当前时间未测量,因此该字段为空。
未来补充:某个产品的 折扣 可能尚未确定,因此 discount 为空。
- 某些属性对某些记录不适用
在某些表中,部分字段可能对某些行不适用,导致这些字段为空。例如:
公司数据库中,某些员工没有奖金,因此 bonus 字段为空。
银行账户表中,某些用户没有贷款,所以 loan_number 字段为空。
顾客可能没有填写备用电话号码,导致 alternate_phone 为空。
这两种情况导致数据库在设计时必须允许NULL 值的存在,以表示缺失或不适用的数据。
15.讨论过程化和非过程化语言的相对优点
过程化语言(Procedural Language):过程化语言要求用户明确指定操作的执行步骤,即 “如何” 计算结果。这种语言通常包括变量、循环、条件语句等结构,允许开发者逐步构建解决方案。
特点
需要定义控制流(如循环、条件语句)。
代码通常较长,需要更详细地描述执行步骤。
常用于命令式编程(Imperative Programming)
示例
DECLAREtotal_salary NUMBER;
BEGINSELECT SUM(salary) INTO total_salaryFROM employeesWHERE department_id = 10;DBMS_OUTPUT.PUT_LINE('Total Salary: ' || total_salary);
END;
这里的 BEGIN 和 END 块定义了执行步骤,包括变量声明、查询执行和结果输出。
优点
可控性强:开发者可以精确控制计算步骤和执行顺序,适用于复杂计算和逻辑控制。
强大的流程控制:支持循环、条件语句等,使其适用于复杂任务(如事务处理、存储过程)。
更好的优化能力:可针对具体场景进行代码优化,提高执行效率。
缺点
代码冗长,开发效率相对较低。
用户需要了解数据库的具体执行机制,难以优化查询。
不适合复杂查询,如多表关联的查询,可能需要手动优化
非过程化语言(Non-Procedural Language):非过程化语言只需要用户描述“是什么”(What),而不需要指定“如何”(How)执行查询。系统会自动决定最佳的执行计划。
特点
声明式(Declarative),只描述查询的需求。
高层次,不要求用户关心底层实现。
常用于数据库查询语言(如SQL)
示例
SELECT customer_name
FROM customer
WHERE customer_city = 'Miami';
这里不需要显式描述如何查找数据,数据库管理系统(DBMS)会自动优化执行。
优点
易学易用:用户无需关心底层操作,只需专注于查询目标。
高效执行:数据库系统可以自动优化查询,提高执行效率。
开发效率高:代码简洁,减少了编程工作量,适合数据分析和查询
缺点
控制力较弱:用户无法直接指定查询的执行策略,可能导致子优化问题。
无法处理复杂逻辑:仅适用于数据查询和简单计算,无法实现复杂的事务控制或循环操作。
性能受限:在特定情况下(如递归查询、大规模数据处理),可能需要手动优化。
相关文章:

数据库系统概念第六版记录 三
外码约束(Foreign Key Constraint) 外码(Foreign Key, FK)是关系数据库中的一个约束,它用于保证表之间的引用完整性。外码的值必须: 要么存在于被引用表的主键列中,要么为空(NULL&…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-files.py
files.py ultralytics\utils\files.py 目录 files.py 1.所需的库和模块 2.class WorkingDirectory(contextlib.ContextDecorator): 3.def spaces_in_path(path): 4.def increment_path(path, exist_okFalse, sep"", mkdirFalse): 5.def file_age(path__fi…...

微信小程序案例1——制作猫眼电影底部标签导航栏
文章目录 一、项目步骤1 新建一个无AppID的movie项目2将准备好的底部标签导航图标拷贝到movie项目下面(将图标文件夹image放到项目文件夹里)3 打开App.json配置文件,在pages数组里添加4个页面路径:电影“pages/movie/movie”、影院“pages/cinema/cinema…...

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)
搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...
【服务器知识】如何在linux系统上搭建一个nfs
文章目录 NFS网络系统搭建**1. 准备工作****2. 服务器端配置****(1) 安装 NFS 服务****(2) 创建共享目录****(3) 配置共享规则****(4) 生效配置并启动服务****(5) 防火墙配置** **3. 客户端配置****(1) 安装 NFS 客户端工具****(2) 创建本地挂载点****(3) 挂载 NFS 共享目录***…...

图片画质增强:轻松提升画质
前言: 今天给大家推荐一款非常实用的图片画质增强软件,它无需联网即可使用,完全离线操作,这款软件基于先进的深度学习技术,能够对模糊图片进行强大的高清处理,效果令人惊艳。 图片画质增强:一…...

vscode快速接入deepseek 实践操作
背景说明 在deepseek快速火爆的情况下,也想自己体验一把。看看在vscode中集成进来,方便平时的脚本开发。对于年纪大的人还是非常方便的。 操作过程 安装continue 打开vscode进入扩展市场,搜索安装 安装完成就是上面的样子,会…...

mapbox进阶,添加绘图扩展插件,绘制圆形
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...
Cursor 与多语言开发:全栈开发的利器
引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域,而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手,凭借其对 20 编程语言 和主流框架的深度支持,正在成为全栈开发的“瑞士军刀”…...

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品
2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出…...

FPGA的IP核接口引脚含义-快解
疑问 手册繁琐,怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌,手册确实比较详细但繁琐,如何快速知晓该部分信息,涛tao道长给你们说,简单得很,一般新入门的道友有所不知,往往后面…...

数据库高安全—审计追踪:传统审计统一审计
书接上文数据库高安全—角色权限:权限管理&权限检查,从权限管理和权限检查方面解读了高斯数据库的角色权限,本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…...

机器学习 - 需要了解的条件概率、高斯分布、似然函数
似然函数是连接数据与参数的桥梁,通过“数据反推参数”的逆向思维,成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”,这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...

Spring Boot Web 入门
目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块,它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南,涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …...

神经网络|(八)概率论基础知识-二项分布及python仿真
【1】引言 前序已经学习了古典概型、条件概率、全概率公式和贝叶斯公式,它们作为基础,解释了事件发生及其概率的对应关系,相关文章链接为: 神经网络|(四)概率论基础知识-古典概型-CSDN博客 神经网络|(五)概率论基础知识-条件概…...
【面试场景】MySQL分布式主键选取
文章目录 一. MySQL的自增主键二. UUID三. 雪花ID(推荐) 我的博客地址 一. MySQL的自增主键 适合单表的情况, 在分布式分库分表下可能会有一些问题 主键冲突问题 在分布式系统中,多个数据库节点独立生成自增主键,很容易出现重复的主键值。例如ÿ…...
执行git stash drop stash@{x} 时出现error: unknown switch `e‘ 的解决方式
原因: 在 PowerShell 或某些 Shell 中,{} 是特殊符号,stash{0} 会被解析成 stash 0,而 后的字符可能被误认为选项(如 -e),使 Git 收到意外的 -e 参数,导致报错 unknown switch ‘e’。 解决方…...

链表和 list
一、单链表的模拟实现 1.实现方式 链表的实现方式分为动态实现和静态实现两种。 动态实现是通过 new 申请结点,然后通过 delete 释放结点的形式构造链表。这种实现方式最能体 现链表的特性; 静态实现是利用两个数组配合来模拟链表。一个表示数据域&am…...
windows 蓝牙驱动开发-传输总线驱动程序常见问题
以下是驱动程序开发人员在开发总线驱动程序以支持蓝牙功能时可能会遇到的一些常见问题和方案。 我的串行总线驱动程序遇到了一些错误。 它意味着什么? 代码 10-49:设备管理器生成的错误代码。 代码 51:当串行总线驱动程序具有相关的控制器…...

Qt修仙之路2-1 炼丹初成
widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...