关系数据库范式设计:从函数依赖到BCNF工程落地
简介本资源是西南交通大学《数据库原理》课程第六章‘关系数据库设计理论’的配套作业详解文档面向计算机专业本科生及数据库初学者聚焦函数依赖分析、ERM反向建模与3NF规范化分解等核心难点。文档完整呈现了含40分简答题、50分设计题与10分学习体会的全套作业题型详细推导了RSid,Sname,Cid,Cname,Score,Tid的关系语义、函数依赖集如Sid→Sname、Cid→Cname、Cid↔Tid、(Sid,Cid)→Score等并给出符合3NF要求的四张分解表学生S、课程C、教师T及选课关系辅以范式判定逻辑与异常分析说明。资源为单个52KB的Word文档.docx内容排版清晰含标准评分栏与防抄袭提示便于对照学习与自查。已有481人下载学习适合课堂复习、课后巩固及期末备考使用。1. 这不是“背范式口诀”就能交差的作业西南交大第6章直击关系数据库设计的工程断层你手头这份《西南交通大学数据库原理作业-第6章 关系数据库设计理论.docx》表面看是期末前一道常规习题实则是一道卡住90%本科生的“隐性门槛题”。它不考SQL写得有多溜也不考索引建得有多快——它专挑你在真实项目里最易翻车的环节下手当一张订单表突然要加退货状态、物流轨迹、多级优惠分摊时为什么字段越加越乱、更新异常频发、连JOIN都开始报错答案就藏在第6章的函数依赖推导、候选码判定和3NF/BCNF分解规则里。这不是纯理论推演而是数据库工程师每天面对的“结构防腐剂”用范式理论提前堵住数据冗余、插入异常、删除异常的漏洞。适合正在做课程设计却总被导师打回重做的同学也适合刚入职发现生产库表命名混乱、字段语义模糊、改个字段要牵动五个服务的初级DBA。别再把Armstrong公理当成数学题来解——这一章本质是教你怎么用逻辑工具给数据库“做CT扫描”找出结构里的病灶。2. 从“订单表越改越崩”切入函数依赖与候选码的工程化判定法2.1 为什么“订单ID商品ID”不能天然当主键——用真实业务反推函数依赖很多同学看到题目给的属性集比如OrderID, ProductID, Qty, UnitPrice, CustomerName, Address, OrderDate就直接套公式结果推导出一堆矛盾依赖。问题出在第一步没把业务语义翻译成数学约束。我们以西南交大作业中高频出现的“电商订单”场景为例假设业务规则明确同一订单下同一商品只出现一次即(OrderID, ProductID)→Qty商品单价由商品本身决定与订单无关即ProductID→UnitPrice客户姓名和地址由客户决定而客户由订单绑定即OrderID→CustomerName, Address订单日期由订单生成时间决定即OrderID→OrderDate。这些不是凭空假设而是从需求文档、接口定义或历史SQL中提取的可验证事实。一旦漏掉ProductID→UnitPrice这条依赖后续所有范式判断都会失准——因为系统里实际存在“同商品不同价”的脏数据你却按“单价随订单变”来建模。# 工程实践中快速验证函数依赖的Python脚本基于pandas import pandas as pd def check_fd(df, lhs_cols, rhs_col): 检查左侧属性组是否函数决定右侧属性 df: DataFrame含所有相关列 lhs_cols: list左侧属性名列表如 [OrderID, ProductID] rhs_col: str右侧属性名如 Qty 返回: True表示满足FDFalse表示存在违反即同一lhs值对应多个rhs值 grouped df.groupby(lhs_cols)[rhs_col].nunique() # 若某组内rhs值唯一则nunique1若存在多值则nunique1 return (grouped 1).all() # 示例读取作业提供的样例数据假设存为order_sample.csv # df pd.read_csv(order_sample.csv) # print(check_fd(df, [OrderID, ProductID], Qty)) # 应返回True # print(check_fd(df, [ProductID], UnitPrice)) # 应返回True # print(check_fd(df, [OrderID], CustomerName)) # 应返回True这段代码不是为了交作业而是帮你把抽象的“函数依赖”变成可执行的校验动作。关键参数说明lhs_cols必须是业务上真正能唯一标识右侧信息的组合不能靠直觉猜rhs_col必须是单个原子属性范式理论不处理复合属性df必须是真实业务数据抽样哪怕只有20行空想依赖必翻车。2.2 候选码不是“找最短主键”而是找“最小闭包覆盖全集”的钥匙西南交大作业第6章常要求“求所有候选码”。学生常犯的错误是枚举所有属性子集挨个试能否推出全部属性——这在8个属性时就有2⁸256种组合纯属自杀式穷举。工程捷径是闭包算法Closure Algorithm它模拟DBMS内部的依赖推理引擎从单个属性出发反复应用已知FD直到无法新增属性若闭包等于全属性集则该属性是超码在所有超码中剔除冗余属性得到最小超码即候选码。以订单表为例已知FDOrderID→CustomerName, Address, OrderDateProductID→UnitPriceOrderID, ProductID→Qty我们手动推OrderID⁺OrderID的闭包初始{OrderID}应用OrderID→CustomerName, Address, OrderDate→{OrderID, CustomerName, Address, OrderDate}无法再推新属性因无FD以CustomerName等为左部→ 闭包未覆盖ProductID, Qty, UnitPrice→OrderID不是超码。再推(OrderID, ProductID)⁺初始{OrderID, ProductID}加OrderID→...→{OrderID, ProductID, CustomerName, Address, OrderDate}加ProductID→UnitPrice→{..., UnitPrice}加OrderID, ProductID→Qty→{..., Qty}全属性集已满 →(OrderID, ProductID)是超码。检查是否最小去掉OrderID→ProductID⁺ {ProductID, UnitPrice}≠ 全集去掉ProductID→OrderID⁺如前 ≠ 全集 →(OrderID, ProductID)是候选码。提示作业中若出现A → B, B → C务必意识到A → C是传递依赖Transitive Dependency这是2NF/3NF的分水岭。别等老师点名才反应过来。3. 从1NF到BCNF四步分解法落地到SQL建表语句3.1 为什么“把所有属性塞进一张表”是最大陷阱——1NF到2NF的物理代价西南交大作业常给一个非规范化表如含重复组的“订单明细”字段要求转为1NF。学生做完就停步但真正的坑在1NF之后比如把订单表拆成Orders(OrderID, CustomerName, Address, OrderDate)和OrderItems(OrderID, ProductID, Qty, UnitPrice)看似干净了却埋下新雷——UnitPrice仍依赖ProductID而非主键OrderID违反2NF。工程后果当商品调价时需更新所有历史订单中的UnitPrice否则报表统计失真若某订单含同一商品多次购买UnitPrice可能因录入时间不同而出现差异破坏数据一致性。解决方案不是硬记“2NF要求非主属性完全依赖于整个候选码”而是用外键参照完整性强制约束-- 正确做法分离商品维度表 CREATE TABLE Products ( ProductID CHAR(10) PRIMARY KEY, ProductName VARCHAR(100), UnitPrice DECIMAL(10,2) NOT NULL, -- 其他商品属性... ); CREATE TABLE Orders ( OrderID CHAR(12) PRIMARY KEY, CustomerName VARCHAR(50), Address TEXT, OrderDate DATE ); CREATE TABLE OrderItems ( OrderID CHAR(12) NOT NULL, ProductID CHAR(10) NOT NULL, Qty INT NOT NULL CHECK (Qty 0), -- 注意这里不再存UnitPrice PRIMARY KEY (OrderID, ProductID), FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) ON DELETE CASCADE, FOREIGN KEY (ProductID) REFERENCES Products(ProductID) );关键点OrderItems表中彻底移除UnitPrice字段查询时通过JOIN获取实时价格。这看似增加JOIN开销却换来数据一致性——这才是2NF的工程本质。3.2 3NF与BCNF的抉择当“经理→部门→员工”遇上“员工→部门→经理”作业第6章难点常出现在3NF与BCNF的边界案例。经典例子Employee(EmpID, Name, DeptName, Manager)FD为EmpID→Name, DeptName, ManagerDeptName→Manager此时(EmpID)是唯一候选码DeptName→Manager是传递依赖EmpID→DeptName→Manager违反3NF。分解为Employees(EmpID, Name, DeptName)Departments(DeptName, Manager)但若业务还存在Manager→DeptName如经理只能管一个部门则DeptName↔Manager构成相互依赖DeptName和Manager都是候选码。此时原表其实满足BCNF所有FD左部都是超码强行分解反而破坏语义。工程判断口诀若非主属性对候选码存在传递依赖A→B→C且B不为候选码必须分解到3NF若存在主属性对非超码的函数依赖如DeptName→Manager而DeptName不是候选码则必须升到BCNFBCNF分解可能丢失依赖如EmpID→Manager无法在分解后直接表达需用JOIN保证逻辑等价。-- BCNF分解后的查询示例确保逻辑不变 SELECT e.EmpID, e.Name, d.Manager FROM Employees e JOIN Departments d ON e.DeptName d.DeptName; -- 此查询等价于原表的 SELECT EmpID, Name, Manager FROM Employee注意MySQL 5.7 默认启用ONLY_FULL_GROUP_BY若GROUP BY未包含所有非聚合字段会报错。这正是3NF/BCNF的底层保障——DBMS强制你写出符合范式的SQL。4. 避坑指南西南交大第6章作业里最常踩的5个血泪坑4.1 现象Armstrong公理推导出矛盾FD如A → B且A → ¬B原因原始FD集本身不一致或在推导中错误应用了伪传递律如A → B, C → D不能直接得A → D。更常见的是混淆了“逻辑蕴含”与“业务事实”——作业给的FD集是理想化模型但你代入的真实数据可能违反它如ProductID→UnitPrice在促销期失效。解决先用2.1节的Python脚本验证原始FD在样本数据中是否成立若不成立说明题目设定与现实脱节需向助教确认FD集是否应补充条件如WHERE statusactive。4.2 现象求出的候选码在SQL中无法设为主键报错“Duplicate entry”原因候选码理论推导正确但作业提供的样例数据存在脏数据如相同OrderID, ProductID出现两次。范式理论假设数据clean而现实数据总有噪声。解决用SQL去重后再验证“SELECT OrderID, ProductID, COUNT(*) FROM raw_table GROUP BY OrderID, ProductID HAVING COUNT(*) 1”若存在重复需按业务规则合并如SUM Qty或标记异常。4.3 现象按3NF分解后JOIN查询结果行数暴增笛卡尔积原因分解时忽略了FD中的多值依赖MVD或未正确设置JOIN条件。典型如StudentID →→ Course学生可选多课课可被多学生选仅用3NF分解会丢失MVD语义。解决识别是否存在MVD题目中若出现“学生-课程-教材”三元关系且教材与课程绑定需用4NF分解否则检查外键约束是否启用FOREIGN KEY ... ON DELETE CASCADE及JOIN条件是否遗漏。4.4 现象BCNF分解后原表的某个查询无法用单个SQL表达原因BCNF分解可能丢失某些函数依赖导致某些查询必须多表JOIN而作业要求“保持依赖”Dependency Preservation。解决优先选择保持依赖的3NF分解如合成算法若题目明确要求BCNF需在答案中注明“此分解不保持依赖应用时需通过JOIN重构逻辑”。4.5 现象作业答案与参考答案不一致纠结哪个正确原因范式分解不唯一同一关系模式可有多种合法分解如用不同属性启动闭包算法。只要满足范式定义、无损连接、保持依赖若要求即为正确。解决用“无损连接检验矩阵法”验证你的分解构造初始矩阵按每个子模式填充已知值反复应用FD更新若某行全为a符号代表原属性则无损。别迷信参考答案重过程不重结果。5. 把范式理论焊进开发流程用SQL注释自动生成ER图与变更清单5.1 用SQL注释固化函数依赖让DBA和开发共享同一份“数据契约”西南交大作业只教你纸面推导但真实团队需要把范式结论落地为可执行资产。我的做法是在建表SQL中用注释声明FD和范式级别让DML操作自动继承约束-- Table: Orders -- FD: OrderID → CustomerName, Address, OrderDate -- NF: 3NF (non-key attributes fully depend on candidate key OrderID) CREATE TABLE Orders ( OrderID CHAR(12) PRIMARY KEY COMMENT 唯一订单号, CustomerName VARCHAR(50) NOT NULL COMMENT FD: OrderID → CustomerName, Address TEXT COMMENT FD: OrderID → Address, OrderDate DATE NOT NULL COMMENT FD: OrderID → OrderDate ); -- Table: Products -- FD: ProductID → ProductName, UnitPrice; CategoryID → CategoryName -- NF: BCNF (all FDs have superkey on left: ProductID is CK, CategoryID is CK) CREATE TABLE Products ( ProductID CHAR(10) PRIMARY KEY COMMENT 商品ID, ProductName VARCHAR(100) NOT NULL COMMENT FD: ProductID → ProductName, UnitPrice DECIMAL(10,2) NOT NULL COMMENT FD: ProductID → UnitPrice, CategoryID CHAR(5) NOT NULL COMMENT FD: CategoryID → CategoryName, FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID) );这些注释不是摆设。我用Python脚本解析SQL文件提取COMMENT中的FD声明自动生成Mermaid ER图# extract_fd_from_sql.py从SQL注释提取FD并生成ER图 import re def parse_fd_from_sql(sql_file): with open(sql_file, r, encodingutf-8) as f: content f.read() # 匹配 COMMENT FD: A → B, C 格式 fd_pattern rCOMMENT\sFD:\s*([^\]) fds [] for line in content.split(\n): match re.search(fd_pattern, line) if match: fd_str match.group(1).strip() # 解析为 (left, right) 元组 if → in fd_str: lhs, rhs [x.strip() for x in fd_str.split(→)] rhs_attrs [x.strip() for x in rhs.split(,)] for attr in rhs_attrs: fds.append((lhs, attr)) return fds # 生成Mermaid语法可粘贴到Typora或VS Code插件渲染 def generate_mermaid(fds): lines [erDiagram] entities set() for lhs, rhs in fds: entities.add(lhs.split(,)[0].strip()) # 取左部第一个属性作为实体 entities.add(rhs) for ent in entities: lines.append(f {ent} ||--o{{ {ent}: \\) for lhs, rhs in fds: lines.append(f {lhs} }|..| {rhs}: \FD\) return \n.join(lines) # 示例输出 # erDiagram # OrderID ||--o{{ OrderID: # CustomerName ||--o{{ CustomerName: # OrderID }|..| CustomerName: FD5.2 数据库变更时用范式检查器拦截高危操作当开发提交ALTER TABLE请求时我们用预检脚本验证是否破坏现有范式变更类型范式风险自动检测逻辑处理建议ADD COLUMN price DECIMAL可能引入部分依赖检查新列是否依赖于候选码的真子集如ProductID是Orders的候选码子集拒绝要求新建Products表DROP COLUMN address可能破坏2NF检查被删列是否为非主属性且其依赖的左部是否仍为候选码真子集若OrderID→address成立允许否则需确认业务逻辑MODIFY COLUMN qty INT→DECIMAL无范式风险类型变更不影响依赖关系通过这个检查器不是银弹但它把西南交大第6章的纸面知识变成了CI/CD流水线里的一道闸门。每次git push触发数据库变更它就默默运行——范式不是考试结束就扔掉的草稿纸而是刻在表结构上的宪法。最后说句实在话我带过三届数据库课程设计凡是能把第6章的函数依赖推导、候选码求解、3NF分解完整走通的同学实习时几乎零故障接手核心交易库。不是因为他们会背BCNF定义而是他们养成了看到一张表就本能问“它的候选码是什么哪些依赖可能被违反”的肌肉记忆。这种思维惯性比任何ORM框架都管用。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

银行排队系统实验报告核心指南:M/M/c建模与仿真验证

银行排队系统实验报告核心指南:M/M/c建模与仿真验证

简介:银行排队系统实验报告是一份面向计算机专业学生的C语言数据结构课程设计资料,以队列为核心模拟银行多窗口排队场景,帮助学习者掌握如何将离散事件仿真转化为可运行的程序,并理解平均逗留时间的计算逻辑。资源为单个doc文档&a…

2026/10/11 19:58:50 阅读更多 →
NullHub架构深度剖析:从单个Zig二进制到内嵌Svelte 5 Web UI的完整实现

NullHub架构深度剖析:从单个Zig二进制到内嵌Svelte 5 Web UI的完整实现

【免费下载链接】nullhub Management console for the Null ecosystem — install, configure, and monitor AI agents, orchestration workflows, task pipelines, and system health 项目地址: https://gitcode.com/gh_mirrors/nu/nullhub 点击查看 免费下载 Nul…

2026/10/11 19:58:50 阅读更多 →
固定频率灵巧噪声移频干扰:MATLAB仿真与脉压验证

固定频率灵巧噪声移频干扰:MATLAB仿真与脉压验证

简介:这份资源面向信号处理与电子对抗方向的学习者与研究人员,提供基于固定频率灵巧噪声仪的移频干扰MATLAB实现方案,适合具备一定MATLAB基础、希望理解噪声源频率偏移与干扰叠加原理的中高级读者。压缩包共3个文件,包含1个m脚本、…

2026/10/11 19:58:50 阅读更多 →

最新新闻

HyperQwen int8 张量核实战:修复 Marlin W4A8 负缩放 bug 并逐层选择激活量化

HyperQwen int8 张量核实战:修复 Marlin W4A8 负缩放 bug 并逐层选择激活量化

HyperQwen int8 张量核实战:修复 Marlin W4A8 负缩放 bug 并逐层选择激活量化 【免费下载链接】HyperQwen Serve large Qwen models fast on the GPUs you actually own. Qwen3.8-27B on a single 24 GB card with vLLM: 127 tok/s single-user (381 when the answe…

2026/10/11 20:55:42 阅读更多 →
VC++双人对决围棋程序:规则与界面实现全解析

VC++双人对决围棋程序:规则与界面实现全解析

简介:一份可以直接编译运行的VC双人围棋对弈程序源码,基于MFC设计,面向刚开始学习VC或对游戏编程感兴趣的开发者。程序支持双人在同一台电脑上轮流落子,自动完成棋盘绘制与胜负判断,并针对15/17寸液晶屏幕提供了窗口尺…

2026/10/11 20:55:42 阅读更多 →
HaleHound-CYD首次启动指南:触屏校准、屏幕旋转与5个常见故障快速排查

HaleHound-CYD首次启动指南:触屏校准、屏幕旋转与5个常见故障快速排查

【免费下载链接】HaleHound-CYD ESP32-DIV HaleHound Edition for Cheap Yellow Display - Multi-protocol offensive security toolkit 项目地址: https://gitcode.com/gh_mirrors/ha/HaleHound-CYD 点击查看 免费下载 HaleHound-CYD 是运行在 ESP32 Cheap Yellow…

2026/10/11 20:55:42 阅读更多 →
五台山景点购票系统:分时预约与防超卖技术方案

五台山景点购票系统:分时预约与防超卖技术方案

简介:这份PPT资源面向计算机专业学生与Java Web开发者,围绕五台山景点购票系统的设计与实现展开,可作为毕业设计、课程设计或SSM框架学习项目的参考方案。内容涵盖系统背景、需求分析、SSM框架选型、管理员与用户功能模块划分、系统测试及结论…

2026/10/11 20:55:42 阅读更多 →
基于模拟退火的VRPSPD求解及Matlab实现——同时取送货车辆路径问题

基于模拟退火的VRPSPD求解及Matlab实现——同时取送货车辆路径问题

1. 项目概述:这是一个什么问题先聊一个做配送调度的朋友几乎都遇到过的情况:快递员早上出门装满一车货,沿途把包裹送出去,同时还要把用户退的旧件、要寄出的箱子一件件收回来。车上的货物量不是在消耗,而是在动态变化—…

2026/10/11 20:55:42 阅读更多 →
google/ax 点名依赖之后:agent 基建下半场,沙箱层开始卷了

google/ax 点名依赖之后:agent 基建下半场,沙箱层开始卷了

google/ax 点名依赖之后:agent 基建下半场,沙箱层开始卷了 【免费下载链接】substrate Agent Substrate: the core system 项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate agent 生态的竞争重心正在肉眼可见地下移&#xf…

2026/10/11 20:54:41 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →