news 2026/9/13 12:10:27

easy-vibe 课程数据库原理篇:表结构与主键、SQL 实战、B+ 树索引、ACID 事务与查询优化全解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
easy-vibe 课程数据库原理篇:表结构与主键、SQL 实战、B+ 树索引、ACID 事务与查询优化全解

easy-vibe 课程数据库原理篇:表结构与主键、SQL 实战、B+ 树索引、ACID 事务与查询优化全解

【免费下载链接】easy-vibe💻 vibe coding 101|The first course for AI-native product builders.项目地址: https://gitcode.com/GitHub_Trending/ea/easy-vibe

本文为 easy-vibe(AI 原生产品构建第一课)附录课程中「数据库原理」一章的系统化精读与扩充。你将跟随原文档的完整脉络,从零理解表/行/列/主键/外键的数据组织方式,掌握 SQL 的 CRUD 与 JOIN 实战写法,深入 B+ 树索引与 ACID 事务的底层原理,并获得一套可直接落地的高并发查询优化策略——读完后你能独立判断何时建索引、如何避免索引失效、以及怎样在高并发下保证数据不丢不乱。

该章在仓库中的原始位置为阿拉伯语版 docs/ar-sa/appendix/5-data/database-fundamentals.md,其对应的中文源文档为 docs/zh-cn/appendix/5-data/database-fundamentals.md,英文等其余语言版本亦同步维护于 docs/en/appendix/5-data/database-fundamentals.md 等路径下。

1. 为什么需要数据库:从 Excel 到海量并发

核心问题:为什么你的 Excel 查询要 10 秒,而淘宝搜索只要 0.01 秒?当数据从"几千条"变成"十亿条",从"单人使用"变成"千万人同时访问",Excel 就不够用了。数据库就是为解决这个问题而生的——它是专门处理海量数据、高并发访问的"超级 Excel"。

1.1 从小书店到淘宝:数据规模的演变

想象你开了一家小书店,每天卖出几本书,随手在笔记本上记下:

2024-01-15:张三买了《百年孤独》,59元 2024-01-16:李四买了《活着》,39元

这时候笔记本完全够用。但当你的书店变成"亚马逊",每天有百万订单涌入,问题就出现了:

  • 数据量大:不是几十行,而是几亿行;
  • 并发访问:不是一个人在查,而是几千万人同时访问;
  • 数据关联:订单关联用户、商品、库存、物流……复杂关系需要高效管理;
  • 数据安全:不能因为断电就丢失所有订单。

两类工具的定位差异可以概括为:

维度Excel / 笔记本数据库
适用对象个人或小团队企业级应用
数据量几千到几万行亿级以上
访问模式单人使用,顺序访问千万人同时在线
查找速度手动查找,速度慢毫秒级查询

这就是"数据库"要解决的问题:如何高效存储、快速查询、安全地管理海量数据?

1.2 案例:不能用 Excel 存用户数据

你可能会说:"我的项目才几万用户,Excel 不就够用了吗?" 课程给出了一个典型故事:

小林创业做了一个社交应用,刚开始用户不多,他用 Excel 存储用户信息(姓名、手机、注册时间等)。当用户突破 10 万时,问题开始出现了:Excel 打开要等 5 分钟;筛选"北京的用户"要卡顿半天;有一次 Excel 文件损坏,几千个用户数据永久丢失。最致命的是,他想实现"查看某个用户的所有订单"——但用户信息和订单分别在不同的 Excel 表里,只能手动复制粘贴,每次都要花半小时。

改用数据库后,一切都变了:

  • 查询"北京的用户"只需要 0.01 秒;
  • 通过"关系"自动关联用户和订单,一个 SQL 语句搞定;
  • 数据自动备份,再也不怕文件损坏。

核心启示:数据库不是"更复杂的 Excel",而是完全不同的设计理念——Excel 为小数据、单人使用设计;数据库为大数据、高并发、复杂关联设计。选择合适的工具,能让系统性能提升成千上万倍。

2. 核心概念:表、行、列、主键、外键

表、行、列、主键就是数据库的"积木块"。想象你要盖房子:表 = 一个房间(存放一类数据)、行 = 房间里的一个箱子(一条完整记录)、列 = 箱子上的标签(姓名、年龄等)、主键 = 箱子的唯一编号(绝对不会重复)。

2.1 用图书馆比喻理解数据库结构

想象你走进一座图书馆,里面的组织和数据库惊人地相似:

概念图书馆比喻实际作用具体例子
数据库 (Database)整座图书馆存放所有数据的容器一个电商网站的数据库
表 (Table)一个书架存放同一类数据的集合用户表、商品表、订单表
列 (Column)书脊上的标签数据的属性(字段)姓名、年龄、手机号
行 (Row)书架上的每一本书一条具体的数据记录"张三,25岁,北京"
主键 (Primary Key)每本书的 ISBN 编号唯一标识每一行的 IDuser_id = 1001

看个真实例子:用户表 (users)

user_id (主键)nameagecityemail
1001张三25北京zhangsan@example.com
1002李四30上海lisi@example.com
1003王五28北京wangwu@example.com
  • users(存放所有用户数据);
  • user_idnameagecityemail(每个用户的属性);
  • :每一行是一个用户(如"张三,25岁,北京");
  • 主键user_id(1001、1002、1003,永不重复)。

2.2 主键(Primary Key):数据的唯一标识

主键就是表中每一行的唯一标识,就像身份证号一样。关键特点:

  • 唯一性:绝对不会重复(没有两个人有相同的身份证号);
  • 非空:必须有值(不可能有"没有身份证号"的人);
  • 不变性:一旦设定,不会修改(你的身份证号不会变)。

常见的做法:使用自增整数(1、2、3、4…),或使用 UUID(全球唯一标识符),如550e8400-e29b-41d4-a716-446655440000

为什么需要主键?想象一下没有主键的世界——你想修改"张三"的年龄,但表里有 3 个"张三",系统该改哪一个?

-- 没有主键,这会同时修改所有叫"张三"的人! UPDATE users SET age = 26 WHERE name = '张三'; -- 有主键,精确修改 UPDATE users SET age = 26 WHERE user_id = 1001;

主键的黄金法则:每个表都应该有一个主键,而且永远不要修改它。

2.3 外键 (Foreign Key):连接表的桥梁

这是数据库比 Excel 强大的关键——表之间可以建立关系

外键是指向另一张表主键的列,用来建立表与表之间的关联。简单理解:主键 = 我的身份证号;外键 = 我引用的别人的身份证号。举个例子:订单表里的user_id就是外键,它指向用户表的主键。

看一个真实的例子:

用户表 (users)

user_id (主键)namephone
1001张三138xxxx
1002李四139xxxx

订单表 (orders)

order_id (主键)product_namepriceuser_id (外键)
5001iPhone 1559991001
5002MacBook149991001
5003AirPods19991002

关键理解

  • 订单表里的user_id = 1001指向用户表里的user_id = 1001(张三);
  • 当你要查"订单 5001 是谁买的",数据库会自动去用户表查找user_id = 1001的用户。

好处

  • 数据不重复:张三买 100 单商品,他的信息也只在用户表存一次;
  • 易于维护:张三换手机号,只改用户表,所有订单自动关联新手机号;
  • 灵活查询:可以轻松回答"每个用户的总消费是多少"这类复杂问题。

在课程站点中,这一节配有一个交互演示组件(源文档中的<DatabaseRelationDemo />标签),用于可视化表与表之间的关联关系。从 package.json 的依赖看,站点基于 VitePress 2(alpha)+ Vue 3 构建,这类交互式演示即由文档站点的主题层渲染,与静态文本互为补充。

3. 与数据库交互:SQL 入门与实战

你不能直接用鼠标"点"数据库(虽然有图形化工具,但本质也是转换成命令),你需要用一种特殊的语言来指挥数据库工作。这种语言就是SQL (Structured Query Language,结构化查询语言)。好消息是:SQL 非常接近自然英语,读起来就像在说话。

3.1 SQL 的核心操作:CRUD

大部分时候,你只需要掌握四种操作,江湖人称CRUD

操作英文SQL 关键字通俗理解
Create创建INSERT新增一条数据
Read读取SELECT查询数据
Update更新UPDATE修改数据
Delete删除DELETE删除数据

这四个操作覆盖了数据处理的全部场景:

  • Create:用户注册时,插入一条新用户记录;
  • Read:用户登录时,查询用户名和密码;
  • Update:用户修改个人资料时,更新表中的数据;
  • Delete:用户注销账号时,删除用户数据。

记住这四个,你就掌握了 80% 的日常 SQL 操作。

3.2 查询数据 (SELECT):数据库最常用的操作

查询是数据库最重要的功能,也是性能优化的关键。

示例 1:查找所有北京的用户

SELECT name, age FROM users WHERE city = '北京';

逐词理解:

  • SELECT name, age:选择 name 和 age 这两列;
  • FROM users:从 users 这张表;
  • WHERE city = '北京':在 city 等于"北京"的条件下。

返回结果

nameage
张三25
王五28

示例 2:查找价格在 5000 到 15000 之间的商品

SELECT name, price FROM products WHERE price BETWEEN 5000 AND 15000;

示例 3:模糊搜索(查找名字包含"张"的用户)

SELECT name FROM users WHERE name LIKE '%张%';

性能陷阱:LIKE 的使用

LIKE '%张%'会导致全表扫描,数据量大时非常慢。优化建议:

  • 不要用LIKE '%张%'(前后都有%);
  • 可以用LIKE '张%'(只有后面有%)。

因为LIKE '张%'可以利用索引,而LIKE '%张%'无法使用索引。

3.3 插入数据 (INSERT):新增记录

示例:新增一个用户

INSERT INTO users (user_id, name, age, city, email) VALUES (1004, '赵六', 35, '广州', 'zhaoliu@example.com');

逐词理解:

  • INSERT INTO users:插入到 users 表;
  • (user_id, name, age, city, email):指定要插入的列;
  • VALUES (1004, '赵六', ...):对应的值。

批量插入(更高效):

INSERT INTO users (name, age, city) VALUES ('小明', 25, '北京'), ('小红', 28, '上海'), ('小刚', 30, '广州');

3.4 更新数据 (UPDATE):修改记录

示例:给所有北京的用户年龄加 1

UPDATE users SET age = age + 1 WHERE city = '北京';

非常危险:别忘了 WHERE!如果你忘记写WHERE子句,会修改所有行

-- 危险!会把所有用户的年龄都改成 26 UPDATE users SET age = 26; -- 正确:只修改 user_id = 1001 的用户 UPDATE users SET age = 26 WHERE user_id = 1001;

真实教训:2012 年,某知名公司因为工程师忘记写 WHERE,导致生产环境数百万用户数据被错误更新,系统瘫痪 4 小时,损失巨大。

3.5 删除数据 (DELETE):删除记录

示例:删除 user_id = 1004 的用户

DELETE FROM users WHERE user_id = 1004;

双重危险:DELETE 更需要 WHERE!

-- 危险!会删除整张表的所有数据! DELETE FROM users; -- 正确:只删除指定行 DELETE FROM users WHERE user_id = 1004;

最佳实践

  1. 删除前先用 SELECT 确认数据;
  2. 在重要系统中,使用"软删除"(添加is_deleted字段标记删除);
  3. 生产环境操作前先备份数据。

3.6 多表查询 (JOIN):数据库的魔法时刻

还记得我们讲过的"外键"吗?SQL 最强大的地方在于可以一次性查询多张关联的表。

场景:查询"张三买过的所有商品"。假设我们有三张表:

用户表 (users)

user_idname
1001张三

商品表 (products)

product_idnameprice
201iPhone 155999
202MacBook14999

订单表 (orders)

order_iduser_idproduct_idquantity
500110012011
500210012022

SQL 查询

SELECT u.name, p.name AS product_name, p.price, o.quantity FROM orders o JOIN users u ON o.user_id = u.user_id JOIN products p ON o.product_id = p.product_id WHERE u.name = '张三';

返回结果

nameproduct_namepricequantity
张三iPhone 1559991
张三MacBook149992

理解 JOIN 的过程

  1. FROM orders o:从订单表开始;
  2. JOIN users u ON o.user_id = u.user_id:通过 user_id 关联用户表;
  3. JOIN products p ON o.product_id = p.product_id:通过 product_id 关联商品表;
  4. WHERE u.name = '张三':筛选张三的订单。

4. 数据库这么快:索引原理揭秘

这是数据库最神奇的地方,也是面试中最爱问的问题。如果你在 Excel 里查找"所有姓张的人",Excel 需要从第一行扫到最后一行。这就是全表扫描——数据越多,速度越慢。但在数据库里,即使有 10 亿行数据,查找也只需要几毫秒。秘诀就是:索引 (Index)。

4.1 直观理解:字典的启示

想象你要在一本没有目录的 1000 页书里找一个词,只能一页一页翻——这就是全表扫描,平均需要翻 500 页。但如果这本书记有拼音索引呢?你要找"数据库"这个词:

  1. 翻到索引,找到"数"字开头的区域;
  2. 在"数"字区域内,找"据"字;
  3. 索引告诉你:在第 256 页。

你只需要翻 3 次就能找到!这就是索引查找。数据库的索引就像书的目录:

  • 没有索引:逐行扫描(10 亿行 = 数分钟);
  • 有索引:直接跳转(10 亿行 = 3 次磁盘 I/O = 几毫秒)。

4.2 全表扫描 vs 索引查找:速度对比

假设我们有一张用户表,有 1000 万条记录。场景:查找user_id = 5,555,555的用户。

方式过程需要检查的行数耗时估算
全表扫描从第 1 行开始,一行一行看平均 500 万行5-30 秒
索引查找查索引树,直接跳到目标位置3-4 次比较0.003 秒

速度差距:数千倍!

核心启示:索引不是银弹,它有代价——占用空间(索引需要额外的存储空间);降低写入速度(每次 INSERT/UPDATE/DELETE 都要更新索引)。

什么时候建索引?

  • 经常用来查询的列(WHERE、JOIN 的条件);
  • 数据量大(几千行以下不需要)。

什么时候不建索引?

  • 很少查询的列;
  • 频繁更新的列;
  • 数据量小的表。

4.3 底层数据结构:B+ 树

真实的索引不是简单的"字母列表",而是一种精心设计的数据结构,叫做B+ 树 (B+ Tree)

B+ 树是一种"矮胖"的树形数据结构:

  • :从根到叶子通常只有 3-4 层;
  • :每个节点可以存储几百个键值。

为什么要"矮胖"?因为数据存储在磁盘上,每次读取磁盘(I/O)都非常慢(比内存慢几千倍)。B+ 树的设计目标就是尽量减少磁盘 I/O 次数:3-4 层高度 = 最多 3-4 次磁盘读取;每层存大量数据 = 保证树不会太高。

真实例子:假设一棵 B+ 树的每个节点可以存储 1000 个键值:

  • 根节点:1000 个键值 → 指向 1000 个子节点;
  • 中间节点:每个存 1000 个键值 → 指向 1000 个叶子节点;
  • 叶子节点:每个存 1000 条真实数据。

总数据量= 1000 × 1000 × 1000 =10 亿条数据,而树的高度只有3 层。这意味着:在 10 亿条数据中查找任意一条,只需要3 次磁盘 I/O——这就是数据库查询飞快的秘密。

5. 事务:保证数据不丢、不乱

想象一下春运抢票的场景:

  • 时间 T1:用户 A 查询,发现"G1234 次列车还剩 1 张票";
  • 时间 T2:用户 B 也查询,也发现"还剩 1 张票";
  • 时间 T3:用户 A 点击"购买",系统扣库存,票卖给了 A;
  • 时间 T4:用户 B 点击"购买"——如果没有保护机制,系统会再次扣库存,把同一张票卖给 B!

这就是典型的并发冲突问题。

5.1 事务 (Transaction) 概述

事务是数据库的一组操作,这些操作要么全部成功,要么全部失败,不会出现"做了一半"的情况。

生活中的例子银行转账就是一个典型的事务:

  1. 从账户 A 扣除 100 元;
  2. 给账户 B 增加 100 元。

如果第 1 步成功了,但第 2 步失败了(比如断电),会发生什么?

  • 没有事务:账户 A 的钱没了,账户 B 没收到钱,钱凭空消失了;
  • 有事务:系统发现第 2 步失败,自动回滚第 1 步,两个账户都恢复原状。

这就是事务的原子性:要么全做,要么全不做。

5.2 事务的四大特性 (ACID)

事务有四大特性,简称ACID

特性英文含义银行转账的例子
Atomicity原子性要么全做,要么全不做扣款和入账必须同时成功,不能只扣钱不入账
Consistency一致性数据始终保持合法状态转账前后,两个账户的总金额应该不变
Isolation隔离性多个事务互不影响A 在转账时,B 看到的应该是"转账前"或"转账后"的余额,不能看到中间状态
Durability持久性一旦提交,数据永久保存转账成功后,即使断电,账户余额也不会变回去

这四个特性保证了数据的安全性:

  • 原子性:防止"做一半"(扣了钱但没到账);
  • 一致性:防止数据不合理(转账后总金额变了);
  • 隔离性:防止并发冲突(两个人同时修改同一数据);
  • 持久性:防止数据丢失(提交后断电也不影响)。

没有这些保证,银行系统根本无法运行。

5.3 事务的隔离级别:权衡安全与性能

理论上,我们希望事务完全隔离。但完全隔离 = 性能极差(因为需要大量加锁,其他事务只能等待)。因此,数据库提供了四种隔离级别

隔离级别脏读不可重复读幻读性能适用场景
读未提交 (Read Uncommitted)可能可能可能最快几乎不用(数据可能错误)
读已提交 (Read Committed)不可能可能可能较快普通业务(Oracle 默认)
可重复读 (Repeatable Read)不可能不可能可能中等银行转账(MySQL 默认)
串行化 (Serializable)不可能不可能不可能最慢极端严格场景(极少用)

三个"读"是什么意思?

  • 脏读:读到了其他事务还没提交的数据(可能回滚,数据不准确);
  • 不可重复读:同一事务里,两次读同一数据,结果不一样(被其他事务修改了);
  • 幻读:同一事务里,两次查询,结果集的行数不一样(其他事务插入/删除了数据)。

通俗例子(银行查余额):

  • 脏读:你查到余额 1000 元,但对方事务回滚了,实际只有 100 元;
  • 不可重复读:你第一次查余额 1000 元,第二次查变成 800 元(被扣款了);
  • 幻读:你第一次查到 5 笔交易,第二次查变成 6 笔(新增了一笔)。

6. 性能优化:让查询快 1000 倍的实战技巧

现在你已经理解了索引、事务这些核心概念。但在真实项目中,你可能会遇到各种性能问题。本节给出可直接落地的优化策略

6.1 索引使用避坑指南

常见错误:索引失效的坑。很多时候,你明明建了索引,但查询还是很慢——因为索引失效了。导致索引失效的常见原因:

  1. 在索引列上使用函数;
  2. 隐式类型转换;
  3. LIKE 查询以 % 开头;
  4. OR 条件(部分情况);
  5. 复合索引不满足最左前缀原则。

坑 1:在索引列上使用函数

-- 错误:对索引列使用函数,无法使用索引 SELECT * FROM users WHERE YEAR(created_at) = 2024; -- 正确:改写为范围查询,可以使用索引 SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';

坑 2:隐式类型转换

-- 假设 user_id 是 int 类型 -- 错误:传字符串,导致隐式转换,无法使用索引 SELECT * FROM users WHERE user_id = '123'; -- 正确:传对应类型 SELECT * FROM users WHERE user_id = 123;

坑 3:LIKE 以 % 开头

-- 错误:以 % 开头,无法使用索引 SELECT * FROM users WHERE name LIKE '%张三%'; -- 正确:以固定前缀开头,可以使用索引 SELECT * FROM users WHERE name LIKE '张三%'; -- 或者使用全文索引(适用于文本搜索) SELECT * FROM users WHERE MATCH(name) AGAINST('张三');

6.2 SQL 优化实战模板

模板 1:分页优化(深分页问题)

-- 问题:OFFSET 很大时,查询越来越慢 SELECT * FROM orders ORDER BY created_at DESC LIMIT 10 OFFSET 1000000; -- 优化方案 1:使用上次查询的时间戳作为游标 SELECT * FROM orders WHERE created_at < '2024-01-15 12:00:00' ORDER BY created_at DESC LIMIT 10; -- 优化方案 2:使用主键范围查询 SELECT * FROM orders WHERE order_id > 1000000 ORDER BY order_id LIMIT 10;

模板 2:批量插入优化

-- 低效:多次单条插入(网络往返多次) INSERT INTO users (name, age) VALUES ('张三', 25); INSERT INTO users (name, age) VALUES ('李四', 30); INSERT INTO users (name, age) VALUES ('王五', 28); -- 高效:单条 SQL 批量插入(只需一次网络往返) INSERT INTO users (name, age) VALUES ('张三', 25), ('李四', 30), ('王五', 28);

**模板 3:避免 SELECT ***

-- 低效:返回所有列(包括不需要的大字段) SELECT * FROM users WHERE user_id = 1; -- 高效:只返回需要的列 SELECT user_id, name, email FROM users WHERE user_id = 1;

6.3 高并发场景应对策略

场景问题解决方案
热点数据某行数据被频繁读写,导致锁竞争使用缓存(Redis)+ 读写分离
秒杀场景瞬间高并发扣减库存乐观锁 + 库存预热 + 消息队列削峰
慢查询复杂查询拖垮数据库索引优化 + 查询拆分 + 读写分离
连接数耗尽太多并发请求导致连接池耗尽连接池优化 + 限流 + 服务降级

性能优化的基本原则

  1. 先测量,后优化:用EXPLAIN分析查询计划,找到真正的瓶颈;
  2. 索引优先:80% 的性能问题都可以通过优化索引解决;
  3. 减少数据库压力:能用缓存就用缓存,能异步就异步;
  4. 分而治之:大表拆分成小表,大查询拆分成小查询。

7. 总结与学习路线

让我们用一张表格来回顾数据库的核心概念:

概念一句话解释解决的问题关键点
表、行、列数据的组织方式如何存储结构化数据表 = Excel 工作表,行 = 记录,列 = 字段
主键每行的唯一标识如何精确找到一行数据唯一、非空、不变
外键连接表的桥梁如何关联不同表的数据指向另一张表的主键
SQL和数据库对话的语言如何增删改查数据SELECT、INSERT、UPDATE、DELETE
索引加速查询的数据结构如何快速找到数据B+ 树,减少磁盘 I/O
事务保证数据安全的机制如何防止并发冲突和丢失数据ACID:原子性、一致性、隔离性、持久性

下一步学习

  1. 动手实践:安装 MySQL 或 PostgreSQL,创建表、插入数据、写 SQL 查询;
  2. ORM 框架:学习如何在代码中使用数据库(如 SQLAlchemy、Prisma、TypeORM);
  3. 索引优化:深入研究复合索引、覆盖索引、索引下推等高级主题;
  4. 事务原理:了解 MVCC(多版本并发控制)、锁机制、隔离级别实现;
  5. 分布式数据库:学习分库分表、读写分离、主从复制等架构。

记住:理论 + 实践 = 真正的掌握

8. 课程仓库中的位置与延伸阅读

这一章在 easy-vibe 仓库中并非孤立存在,而是附录「数据 (5-data)」板块的入口性文档。同一目录下还配套了多篇数据专题文档,可与本文形成完整的知识面:

  • docs/ar-sa/appendix/5-data/data-models.md(数据模型):数据建模是本文"表/主键/外键"概念在业务层面的延伸;
  • docs/ar-sa/appendix/5-data/data-governance.md(数据治理)、docs/ar-sa/appendix/5-data/data-analysis.md(数据分析)、docs/ar-sa/appendix/5-data/data-visualization.md(数据可视化)、docs/ar-sa/appendix/5-data/data-tracking.md(埋点)与 docs/ar-sa/appendix/5-data/ab-testing.md(A/B 实验)。

该附录的总导航页位于 docs/ar-sa/appendix/index.md,其中按"AI 基础 / 前端基础 / 数据"等类别组织了全部附录文章;阿拉伯语版、中文版(docs/zh-cn/appendix/5-data/database-fundamentals.md)与英文版(docs/en/appendix/5-data/database-fundamentals.md)之间逐节对应,可按 docs/ar-sa/appendix/5-data/database-fundamentals.md 的章节号(1 动机 → 2 核心概念 → 3 SQL → 4 索引 → 5 事务 → 6 优化 → 7 总结)直接定位各语言版本。

从仓库工程结构看,本站是一个 VitePress 2(alpha)+ Vue 3 + Element Plus 的多语言文档站(见 package.json):npm run dev启动开发服务器(vitepress dev docs),npm run build:single等脚本负责 sitemap 生成与多语言构建。本文源文档中出现的<DatabaseRelationDemo /><SqlPlaygroundDemo /><BPlusTreeDemo /><TransactionACIDDemo /><QueryOptimizationDemo />等交互演示标签,对应课程站点上"外键关联、SQL 练习、B+ 树、ACID 事务、查询优化"五个可交互实验;从 package.json 的 lint 脚本(eslint docs/.vitepress/theme)与 scripts/scan-appendix-component-i18n.mjs 可推断,这些组件由 VitePress 主题层提供,并有专门的脚本用于扫描附录页面组件的多语言一致性——这也是学习本文时值得留意的课程工程细节:交互式演示与静态文本共同构成了这一章的完整教学内容。

需要说明的适用前提:本文所有 SQL 示例(如BETWEENLIKEMATCH ... AGAINSTLIMIT/OFFSET)均以 MySQL 语法为基准;MySQL 默认可重复读、Oracle 默认读已提交的隔离级别默认值属于数据库产品的通用事实,具体行为以你所使用的数据库版本为准。

【免费下载链接】easy-vibe💻 vibe coding 101|The first course for AI-native product builders.项目地址: https://gitcode.com/GitHub_Trending/ea/easy-vibe

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 12:07:34

PyQt5蚁群算法路径规划GUI:可交互、可调试、可保存的工程化工作台

简介&#xff1a;本资源是一个基于MATLAB实现的路径规划GUI系统&#xff0c;面向机器人导航、智能交通与算法学习者等初/中级开发者&#xff0c;聚焦于将改进型蚁群算法嵌入可视化交互界面&#xff0c;解决复杂障碍环境下最优路径求解与结果动态呈现问题。压缩包共51个文件&…

作者头像 李华
网站建设 2026/9/13 12:05:36

基于MATLAB的离散位错动力学模拟:应力场与Peach-Koehler力解析

简介&#xff1a;面向金属塑性变形与位错动力学研究者的二维DDD&#xff08;离散位错动力学&#xff09;MATLAB工具包&#xff0c;用于计算滑移面上的应力分布并模拟位错运动。当前版本聚焦单个滑移面上的位错运动&#xff0c;作者正计划扩展为一系列相同滑移面的模拟&#xff…

作者头像 李华
网站建设 2026/9/13 12:04:34

6个月打造机器人作品集:从ROS2小车到机械臂仿真实战

开篇我先把话放在这儿&#xff1a;别再把“人形机器人”当成你的学习方向了。今天你刷到的那些双足行走、灵巧手抓取的炫酷视频&#xff0c;背后是动辄千万级融资的团队和博士起步的算法岗&#xff0c;普通人连一台开发样机都摸不到&#xff0c;刷三年新闻也换不来一场面试机会…

作者头像 李华
网站建设 2026/9/13 12:04:19

Spring Boot中@Cacheable缓存失效问题解析与解决方案

1. 问题背景与现象分析在Spring Boot项目中&#xff0c;我们经常会使用Cacheable注解来实现方法级别的缓存&#xff0c;特别是与Redis集成时&#xff0c;这种缓存机制能显著提升系统性能。但很多开发者都遇到过这样的困惑&#xff1a;明明加了Cacheable注解&#xff0c;缓存却完…

作者头像 李华
网站建设 2026/9/13 12:03:50

Java Web SSM商城项目实战:从搭建到调试全链路指南

简介&#xff1a;这是一套完整的Java Web网上商城实战项目源码&#xff0c;面向Java初学者与SSM框架学习者&#xff0c;帮助掌握企业级电商系统从前台展示到后台管理的全链路开发能力。资源包含1491个文件&#xff0c;涵盖75个核心Java业务类、40个JSP页面&#xff08;含商品列…

作者头像 李华
网站建设 2026/9/13 12:03:15

检测前已经知道竞品经常被推荐,还需要记录哪些起点信息?

已经注意到竞品经常出现在AI推荐里&#xff0c;是一个有价值的线索。但在开始GEO工作前&#xff0c;仍需要说明它出现在哪些需求中、以什么理由被选择&#xff0c;以及自己的品牌在相同场景下表现如何。起点记录的作用&#xff0c;是把别人经常上榜这样的印象&#xff0c;转换成…

作者头像 李华