[{"data":1,"prerenderedAt":1030},["ShallowReactive",2],{"post:\u002Fposts\u002Fmysql\u002Fmysql-learning-01":3,"posts:ordered":733},{"id":4,"title":5,"body":6,"category":716,"cover":717,"date":718,"description":719,"extension":720,"featured":721,"meta":722,"navigation":723,"path":724,"seo":725,"series":726,"seriesOrder":92,"stem":727,"tags":728,"__hash__":732},"posts\u002Fposts\u002Fmysql\u002Fmysql-learning-01.md","MySQL 学习笔记 01：MySQL 基础知识",{"type":7,"value":8,"toc":688},"minimark",[9,16,21,26,29,40,44,47,56,60,65,68,81,108,115,122,126,129,136,139,142,146,150,166,170,198,202,210,214,218,241,245,255,368,372,385,391,393,397,401,415,419,425,441,445,453,457,467,473,481,483,487,491,511,515,519,530,534,545,549,555,557,561,565,638,642,684],[10,11,12],"blockquote",{},[13,14,15],"p",{},"这是我在学习 SQL \u002F MySQL 时整理的系列笔记（共 11 篇）：讲解部分是我按自己的理解写的，示例数据和 SQL 都是我整理并在 MySQL 8 上跑过的，参考的主要是 MySQL 官方文档和一些公开的入门视频。理解有偏差的地方欢迎指出。",[17,18,20],"h1",{"id":19},"_0-mysql-server-与-mysql-workbench-下载指南","0 MySQL Server 与 MySQL Workbench 下载指南",[22,23,25],"h2",{"id":24},"_01-核心概念","0.1 核心概念",[13,27,28],{},"MySQL 是关系型数据库（Relational Database）。MySQL Workbench 是一个可视化并对数据库（DB）执行操作的工具。两者均可从官方地址下载：",[30,31,37],"pre",{"className":32,"code":34,"language":35,"meta":36},[33],"language-text","https:\u002F\u002Fdev.mysql.com\u002Fdownloads\u002F\n","text","",[38,39,34],"code",{"__ignoreMap":36},[22,41,43],{"id":42},"_02-windows-安装","0.2 Windows 安装",[13,45,46],{},"通过“MySQL Installer for Windows”下载 MySQL Server 和 MySQL Workbench。",[13,48,49,50],{},"Windows 这边的安装步骤我参考了这个视频：",[51,52,53],"a",{"href":53,"rel":54},"https:\u002F\u002Fyoutu.be\u002FYSOY_NyOg40?t=57",[55],"nofollow",[22,57,59],{"id":58},"_03-mac-安装","0.3 Mac 安装",[61,62,64],"h3",{"id":63},"_031-mysql-community-server","0.3.1 MySQL Community Server",[13,66,67],{},"从官方下载并跟随安装步骤，安装过程中：",[69,70,71,75,78],"ul",{},[72,73,74],"li",{},"系统会提示创建“root”用户的密码（Password），需记录。",[72,76,77],{},"端口（Port）保留默认值 3306。",[72,79,80],{},"验证安装：在终端（Terminal）输入以下命令连接数据库：",[30,82,86],{"className":83,"code":84,"language":85,"meta":36,"style":36},"language-bash shiki shiki-themes github-light github-dark","mysql -u root -p\n","bash",[38,87,88],{"__ignoreMap":36},[89,90,93,97,101,105],"span",{"class":91,"line":92},"line",1,[89,94,96],{"class":95},"sScJk","mysql",[89,98,100],{"class":99},"sj4cs"," -u",[89,102,104],{"class":103},"sZZnC"," root",[89,106,107],{"class":99}," -p\n",[13,109,110,111,114],{},"连接成功后应显示 MySQL 监视器（Monitor）欢迎信息及版本号（如 8.0.45 MySQL Community Server）。输入 ",[38,112,113],{},"quit"," 退出。",[13,116,117,118],{},"连接和验证的过程参考了这个视频：",[51,119,120],{"href":120,"rel":121},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=aVH81OT5XVk",[55],[61,123,125],{"id":124},"_032-mysql-workbench","0.3.2 MySQL Workbench",[13,127,128],{},"下载并安装 MySQL Workbench。",[13,130,131,132],{},"Workbench 的安装参考了这个视频：",[51,133,134],{"href":134,"rel":135},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=npt01LZMCVc",[55],[13,137,138],{},"连接前提条件：必须先运行 MySQL Server，才能通过“root”用户和端口 3306 连接实例。",[140,141],"hr",{},[17,143,145],{"id":144},"_1-数据库与-dbms-基础","1 数据库与 DBMS 基础",[22,147,149],{"id":148},"_11-database-数据库","1.1 Database (数据库)",[69,151,152,160,163],{},[72,153,154,155,159],{},"数据库（Database）是",[156,157,158],"strong",{},"有组织的数据集合","，用来为现实世界的某个方面建模：数据不是随手堆在一起，而是按一定结构存起来，方便查询和维护。",[72,161,162],{},"示例：一个电商系统里会分别存客户、订单、商品的数据，再通过它们之间的联系把信息串起来。",[72,164,165],{},"它是绝大多数软件应用的核心组件——不管什么产品，数据最终都要落到数据库里。",[22,167,169],{"id":168},"_12-database-management-system-dbms数据库管理系统","1.2 Database Management System (DBMS，数据库管理系统)",[69,171,172,175],{},[72,173,174],{},"DBMS 就是管理数据库的软件，应用通过它来存储、查询和维护数据。",[72,176,177,178],{},"它要负责的事情大致有六类：\n",[69,179,180,183,186,189,192,195],{},[72,181,182],{},"数据定义与操作（data definition and manipulation）：建表、改表，以及增删改查。",[72,184,185],{},"数据安全与访问控制（data security and access control）：认证、授权、加密。",[72,187,188],{},"数据完整性（data integrity）：用约束保证数据准确且一致。",[72,190,191],{},"并发控制（concurrency control）：让多个用户和应用同时访问同一份数据而不互相踩踏。",[72,193,194],{},"备份与恢复（backup and recovery）。",[72,196,197],{},"事务管理（transaction management）：保证一组操作可靠地完成或整体回退。",[22,199,201],{"id":200},"_13-data-model-数据模型-与-schema-模式","1.3 Data Model (数据模型) 与 Schema (模式)",[69,203,204,207],{},[72,205,206],{},"数据模型（data model）是对\"数据长什么样、彼此怎么关联\"的一套抽象描述。",[72,208,209],{},"模式（schema）是这套模型在具体数据库里的结构：以关系模型为例，schema 里会写明有哪些表、每张表有哪些列、表之间靠什么关联、建了哪些索引。",[22,211,213],{"id":212},"_14-数据模型类型","1.4 数据模型类型",[61,215,217],{"id":216},"_141-relational-model-关系模型","1.4.1 Relational Model (关系模型)",[69,219,220,223,226],{},[72,221,222],{},"用数据之间的逻辑关系来组织数据库，是今天最主流的模型。",[72,224,225],{},"映射关系很直观：实体 → 表，属性 → 列，实体之间的联系 → 表之间的键约束。",[72,227,228,229,232,233,236,237,240],{},"示例：",[38,230,231],{},"Customers","（客户）和 ",[38,234,235],{},"Orders","（订单）两张表，通过订单上的 ",[38,238,239],{},"CustId"," 指向客户的主键建立联系。",[61,242,244],{"id":243},"_142-document-model-文档模型","1.4.2 Document Model (文档模型)",[69,246,247,250,253],{},[72,248,249],{},"非关系 (NoSQL) 数据模型。",[72,251,252],{},"数据由 documents (文档) 表示，包含 field-value pairs (字段-值对)。",[72,254,228],{},[30,256,260],{"className":257,"code":258,"language":259,"meta":36,"style":36},"language-json shiki shiki-themes github-light github-dark","{\n  \"orderId\": 1001,\n  \"amount\": 99,\n  \"items\": [\n    {\"sku\": \"A-01\", \"qty\": 2},\n    {\"sku\": \"B-07\", \"qty\": 1}\n  ]\n}\n","json",[38,261,262,268,283,296,305,333,357,363],{"__ignoreMap":36},[89,263,264],{"class":91,"line":92},[89,265,267],{"class":266},"sVt8B","{\n",[89,269,271,274,277,280],{"class":91,"line":270},2,[89,272,273],{"class":99},"  \"orderId\"",[89,275,276],{"class":266},": ",[89,278,279],{"class":99},"1001",[89,281,282],{"class":266},",\n",[89,284,286,289,291,294],{"class":91,"line":285},3,[89,287,288],{"class":99},"  \"amount\"",[89,290,276],{"class":266},[89,292,293],{"class":99},"99",[89,295,282],{"class":266},[89,297,299,302],{"class":91,"line":298},4,[89,300,301],{"class":99},"  \"items\"",[89,303,304],{"class":266},": [\n",[89,306,308,311,314,316,319,322,325,327,330],{"class":91,"line":307},5,[89,309,310],{"class":266},"    {",[89,312,313],{"class":99},"\"sku\"",[89,315,276],{"class":266},[89,317,318],{"class":103},"\"A-01\"",[89,320,321],{"class":266},", ",[89,323,324],{"class":99},"\"qty\"",[89,326,276],{"class":266},[89,328,329],{"class":99},"2",[89,331,332],{"class":266},"},\n",[89,334,336,338,340,342,345,347,349,351,354],{"class":91,"line":335},6,[89,337,310],{"class":266},[89,339,313],{"class":99},[89,341,276],{"class":266},[89,343,344],{"class":103},"\"B-07\"",[89,346,321],{"class":266},[89,348,324],{"class":99},[89,350,276],{"class":266},[89,352,353],{"class":99},"1",[89,355,356],{"class":266},"}\n",[89,358,360],{"class":91,"line":359},7,[89,361,362],{"class":266},"  ]\n",[89,364,366],{"class":91,"line":365},8,[89,367,356],{"class":266},[61,369,371],{"id":370},"_143-vector-model-向量模型","1.4.3 Vector Model (向量模型)",[69,373,374,377,380,383],{},[72,375,376],{},"数组数据模型。",[72,378,379],{},"数据由 array of embeddings (嵌入数组) 表示。",[72,381,382],{},"用于 Machine Learning (机器学习) 和 Data Science (数据科学)。",[72,384,228],{},[30,386,389],{"className":387,"code":388,"language":35,"meta":36},[33],"id1 -> [0.45, 0.67, 0.50, ...]\nid2 -> [0.79, 0.54, 0.10, ...]\n",[38,390,388],{"__ignoreMap":36},[140,392],{},[17,394,396],{"id":395},"_2-关系数据库核心概念与-sql-历史","2 关系数据库核心概念与 SQL 历史",[22,398,400],{"id":399},"_21-关系数据库优势","2.1 关系数据库优势",[69,402,403,406,409,412],{},[72,404,405],{},"使用 SQL 查询和管理数据。",[72,407,408],{},"通过 constraints (约束) 强制数据完整性，例如 Primary Key (主键) 和 Foreign Key (外键)。",[72,410,411],{},"支持 ACID transactions (ACID 事务)：Atomicity (原子性)、Consistency (一致性)、Isolation (隔离性)、Durability (持久性)。",[72,413,414],{},"建立表间关系，支持复杂查询和检索。",[22,416,418],{"id":417},"_22-sql-历史","2.2 SQL 历史",[30,420,423],{"className":421,"code":422,"language":35,"meta":36},[33],"1971 IBM 创建第一个关系查询语言 SQUARE\n1972 IBM 为关系数据库 System R 创建 SEQUEL\n1986 SQL 被 ANSI 和 ISO 标准组正式采纳为操作数据库的标准语言\n",[38,424,422],{"__ignoreMap":36},[69,426,427],{},[72,428,429,430],{},"SQL 子语言：\n",[69,431,432,435,438],{},[72,433,434],{},"DDL (Data Definition Language，数据定义语言)：创建和修改数据库对象。",[72,436,437],{},"DML (Data Manipulation Language，数据操纵语言)：查询和更新数据。",[72,439,440],{},"DCL (Data Control Language，数据控制语言)：创建角色、授予访问权限。",[22,442,444],{"id":443},"_23-数据完整性与引用完整性","2.3 数据完整性与引用完整性",[69,446,447,450],{},[72,448,449],{},"Data integrity (数据完整性)：数据是否一致且准确。",[72,451,452],{},"Referential integrity (引用完整性)：关系数据库通过 Primary Key (主键) 和 Foreign Key (外键) 约束强制表间一致链接。",[22,454,456],{"id":455},"_24-键与表关系","2.4 键与表关系",[69,458,459,462,465],{},[72,460,461],{},"Primary key (主键)：表中行的唯一标识符。",[72,463,464],{},"Foreign key (外键)：连接表并建立依赖关系。",[72,466,228],{},[30,468,471],{"className":469,"code":470,"language":35,"meta":36},[33],"CUSTOMER (parent table，父表)\nORDER (dependent table，依赖表)\n",[38,472,470],{"__ignoreMap":36},[69,474,475,478],{},[72,476,477],{},"想删掉 CUSTOMER 里的某个客户，但 ORDER 里还挂着他的订单时，删除会被引用完整性拦住；反过来，往 ORDER 里插一条指向不存在客户的记录，同样插不进去。",[72,479,480],{},"复合主键（composite primary key）：由多于一列共同组成唯一标识，例如 ORDER_DETAILS 里的 (OrderId, ProductId)；引用它的外键也要对应这组列。",[140,482],{},[17,484,486],{"id":485},"_3-acid-与-sql-vs-nosql","3 ACID 与 SQL vs NoSQL",[22,488,490],{"id":489},"_31-acid-属性","3.1 ACID 属性",[69,492,493,496,499,502,505,508],{},[72,494,495],{},"数据库里的一组操作通常放在事务（transaction）里执行。",[72,497,498],{},"原子性（atomicity）：整个事务要么全部成功、要么全部回滚（rollback），不会停在中间状态。",[72,500,501],{},"一致性（consistency）：事务执行前后都要满足表上的约束，数据不会停在\"半对半错\"的状态。",[72,503,504],{},"隔离性（isolation）：并发执行的事务之间互不干扰。",[72,506,507],{},"持久性（durability）：事务一旦提交，即使之后系统故障，数据也不会丢。",[72,509,510],{},"顺带一提：NoSQL 并不等于\"不要 ACID\"，它只是常常为了扩展性放弃其中一部分保证。",[22,512,514],{"id":513},"_32-sql-vs-nosql数据一致性视角","3.2 SQL vs NoSQL：数据一致性视角",[61,516,518],{"id":517},"_321-sqlrelational-sql关系型","3.2.1 SQL\u002FRelational (SQL\u002F关系型)",[69,520,521,524,527],{},[72,522,523],{},"结构化 schemas (模式) 和 tables (表)，强调数据一致性。",[72,525,526],{},"传统上 vertical scaling (垂直扩展)；在 horizontal scaling (水平扩展) 的分布式系统中维护 ACID 更具挑战。",[72,528,529],{},"用例：Healthcare orders (医疗订单)、Commercial banking (商业银行)、Accounting (会计)，数据可靠性和一致性关键。",[61,531,533],{"id":532},"_322-nosqlnon-relational-nosql非关系型","3.2.2 NoSQL\u002FNon-relational (NoSQL\u002F非关系型)",[69,535,536,539,542],{},[72,537,538],{},"灵活数据结构，强调 scalability (可扩展性) 和 performance (性能)，牺牲部分一致性。",[72,540,541],{},"Horizontal + vertical scaling (水平 + 垂直扩展)。",[72,543,544],{},"用例：非结构化数据如 documents (文档)、images (图像)、multimedia content (多媒体内容)，例如 media streaming services (媒体流服务)、social media services (社交媒体服务)；Graph and network analysis (图与网络分析)，例如 social network analysis (社交网络分析)。",[22,546,548],{"id":547},"_33-关系型-dbms-类型","3.3 关系型 DBMS 类型",[30,550,553],{"className":551,"code":552,"language":35,"meta":36},[33],"PostgreSQL：完全开源；高级特性如 JSONB 支持、自定义数据类型、复杂索引。\nMySQL：开源但由 Oracle 拥有；功能简单易用。\nMicrosoft SQL Server：商业；丰富企业功能如高级安全。\n",[38,554,552],{"__ignoreMap":36},[140,556],{},[17,558,560],{"id":559},"_4-mysql-数据类型与-sql-学习路线","4 MySQL 数据类型与 SQL 学习路线",[22,562,564],{"id":563},"_41-mysql-常见数据类型","4.1 MySQL 常见数据类型",[69,566,567,581,587,593,614,624],{},[72,568,569,572,573,576,577,580],{},[38,570,571],{},"VARCHAR(n)","：变长字符串，",[38,574,575],{},"n"," 是最大字符数，",[156,578,579],{},"必须指定","。适合长度可预期、又不太长的文本（姓名、邮箱等）。",[72,582,583,586],{},[38,584,585],{},"TEXT","：长文本，适合长度不确定的内容（文章正文等）；不能设默认值，建索引时通常要指定前缀长度。",[72,588,589,592],{},[38,590,591],{},"INT","：整数，常用于主键、数量这类字段。",[72,594,595,598,599,601,602,605,606,609,610,613],{},[38,596,597],{},"DECIMAL(p, s)","：定点小数，",[38,600,13],{}," 是总位数、",[38,603,604],{},"s"," 是小数位数；金额这类要求精确的值不要用 ",[38,607,608],{},"FLOAT","\u002F",[38,611,612],{},"DOUBLE","。",[72,615,616,619,620,623],{},[38,617,618],{},"DATE"," \u002F ",[38,621,622],{},"DATETIME","：日期与日期时间。",[72,625,626,629,630,633,634,637],{},[38,627,628],{},"JSON","：MySQL 5.7 起支持，以二进制格式存储 JSON 文档，可以直接用 ",[38,631,632],{},"->","、",[38,635,636],{},"->>"," 取字段。",[22,639,641],{"id":640},"_42-这个系列的学习路线","4.2 这个系列的学习路线",[69,643,644,664],{},[72,645,646,647],{},"先解决\"怎么把数据查出来\"（第 02～04 篇）：\n",[69,648,649,652,655,658,661],{},[72,650,651],{},"基本查询（SELECT）",[72,653,654],{},"连接数据（JOIN）",[72,656,657],{},"聚合与分组（aggregation & grouping）",[72,659,660],{},"输出控制（ORDER BY \u002F LIMIT）",[72,662,663],{},"数据操纵：插入、更新、删除（INSERT \u002F UPDATE \u002F DELETE）",[72,665,666,667],{},"再解决\"怎么把结构设计好\"（第 05～11 篇）：\n",[69,668,669,672,675,678,681],{},[72,670,671],{},"数据定义语言（DDL）",[72,673,674],{},"创建数据库对象：表、索引、视图",[72,676,677],{},"删除和修改对象（DROP \u002F ALTER）",[72,679,680],{},"用约束保证数据完整性（constraints）",[72,682,683],{},"视图与存储过程（views \u002F stored procedures）",[685,686,687],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":36,"searchDepth":285,"depth":285,"links":689},[690,691,692,696,697,698,699,704,705,706,707,708,709,713,714,715],{"id":24,"depth":270,"text":25},{"id":42,"depth":270,"text":43},{"id":58,"depth":270,"text":59,"children":693},[694,695],{"id":63,"depth":285,"text":64},{"id":124,"depth":285,"text":125},{"id":148,"depth":270,"text":149},{"id":168,"depth":270,"text":169},{"id":200,"depth":270,"text":201},{"id":212,"depth":270,"text":213,"children":700},[701,702,703],{"id":216,"depth":285,"text":217},{"id":243,"depth":285,"text":244},{"id":370,"depth":285,"text":371},{"id":399,"depth":270,"text":400},{"id":417,"depth":270,"text":418},{"id":443,"depth":270,"text":444},{"id":455,"depth":270,"text":456},{"id":489,"depth":270,"text":490},{"id":513,"depth":270,"text":514,"children":710},[711,712],{"id":517,"depth":285,"text":518},{"id":532,"depth":285,"text":533},{"id":547,"depth":270,"text":548},{"id":563,"depth":270,"text":564},{"id":640,"depth":270,"text":641},"学习",null,"2026-10-09","MySQL 学习笔记第一篇：MySQL Server 与 Workbench 的安装，数据库与 DBMS 的基本概念，关系模型、ACID 事务、常见数据类型，以及后续的学习路线。","md",false,{},true,"\u002Fposts\u002Fmysql\u002Fmysql-learning-01",{"title":5,"description":719},"SQL 学习笔记","posts\u002Fmysql\u002Fmysql-learning-01",[729,730,731],"SQL","MySQL","学习笔记","vAktJ90btwdRkKi88W6IosAcbqZlbY50yCqRdbarrl8",[734,741,747,753,759,765,771,777,783,789,795,801,807,813,819,825,831,837,843,849,855,860,865,870,875,880,885,890,895,901,905,909,913,917,921,925,929,933,937,941,945,951,955,960,964,968,972,976,980,984,988,989,993,997,1002,1007,1013,1017,1022,1026],{"path":735,"title":736,"description":737,"date":738,"series":739,"seriesOrder":740},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-28","软件分析与设计笔记 28：draw.io 作图手册：五张图的符号位置、落笔顺序与自检","不模拟软件界面，只讲清三件事：每个 UML 符号在 draw.io 里搜什么词、一张图该按什么顺序落笔、画完拿什么标准自查。覆盖用例图、活动图、顺序图、类图、界面草图五种图纸，末尾附「最容易画反的十二笔」总检表。","2026-11-19","软件分析与设计笔记",28,{"path":742,"title":743,"description":744,"date":745,"series":739,"seriesOrder":746},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-27","软件分析与设计笔记 27：Paper 1 应试：从读案例到交卷的一次完整演算","拿一份完整的案例，从头到尾走一遍：怎么读案例列角色、怎么在四个小问之间分配时间、每一张图从哪一句话推出来、两张表怎么填、交卷前拿什么清单自查。附 C25 真题与样卷的题型分值对照。","2026-11-18",27,{"path":748,"title":749,"description":750,"date":751,"series":739,"seriesOrder":752},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-26","软件分析与设计笔记 26：总结：把整条链路串起来","系列收尾：从需求到代码的完整链路回顾、每一环的产出与验收方式、六条贯穿全系列的原则，以及一份可以直接拿去做项目自查的清单。","2026-11-17",26,{"path":754,"title":755,"description":756,"date":757,"series":739,"seriesOrder":758},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-25","软件分析与设计笔记 25：代码重构：坏味道与手法","重构不改变外部行为、只改善内部结构：四种常见坏味道与对应手法、为什么动手之前必须先有测试、什么时候该重构，以及重构和前面那些设计模型是什么关系。","2026-11-16",25,{"path":760,"title":761,"description":762,"date":763,"series":739,"seriesOrder":764},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-24","软件分析与设计笔记 24：设计原则：内聚、耦合与多态","好设计怎么衡量：内聚与耦合分别在说什么、一次从「差设计」到「多态重设计」的完整对照、抽象类与接口的选择依据，以及复用为什么会从优势变成风险。","2026-11-15",24,{"path":766,"title":767,"description":768,"date":769,"series":739,"seriesOrder":770},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-23","软件分析与设计笔记 23：设计建模：从对象模型到能实现的方案","分析模型能用但还不能直接开工：对象模型怎么映射到关系模型、继承映射的三种方案怎么选、数据访问层与 Data Broker 解决什么问题，以及三层架构与 MVC 的分工。","2026-11-14",23,{"path":772,"title":773,"description":774,"date":775,"series":739,"seriesOrder":776},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-22","软件分析与设计笔记 22：分析建模：边界、实体与控制对象","不经过分析直接写代码会踩什么坑、三种分析对象各管一段、怎么用顺序图完成一次用例实现，以及从顺序图导出类的属性、操作与关系的方法。","2026-11-13",22,{"path":778,"title":779,"description":780,"date":781,"series":739,"seriesOrder":782},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-21","软件分析与设计笔记 21：UML：类图与顺序图","为什么需要一种共同的画法：类符号三格怎么画、五种关系的符号与设计含义、每种关系落到 Java 是什么写法，顺序图的三要素怎么摆；以及这三种最容易找不到的符号在 draw.io 里各搜什么词。","2026-11-12",21,{"path":784,"title":785,"description":786,"date":787,"series":739,"seriesOrder":788},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-20","软件分析与设计笔记 20：面向对象概念：对象、关系与多态","面向对象不是「用某个语言写代码」：对象与类的区别、封装真正在保护什么、五种关系（依赖、关联、聚合、组合、继承）各自何时用，以及多态为什么能减少条件判断。","2026-11-11",20,{"path":790,"title":791,"description":792,"date":793,"series":739,"seriesOrder":794},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-19","软件分析与设计笔记 19：规范化与逻辑数据模型","一次改地址引发的数据不一致，讲清规范化的真正动机；UNF 到 3NF 每一步在解决什么问题，派生字段为什么不能存，优化为什么和规范化方向相反，以及逻辑数据模型在 3NF 之上补了什么。","2026-11-10",19,{"path":796,"title":797,"description":798,"date":799,"series":739,"seriesOrder":800},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-18","软件分析与设计笔记 18：数据库分析：实体、关系与数据字典","为什么不能拿到需求就动手建表：实体与关系怎么判定、基数为什么必须由业务方确认、数据命名要遵守什么规则，以及数据字典四列里最容易被空着的那一列。","2026-11-09",18,{"path":802,"title":803,"description":804,"date":805,"series":739,"seriesOrder":806},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-17","软件分析与设计笔记 17：用生成式 AI 做设计与开发：能用的场景与要防的坑","生成式 AI 在工作流里真正站得住的三个场景 —— 造示例数据、解释陌生代码、起草初稿；它为什么会复现社会偏见、为什么会编得像真的，以及哪些内容绝不能直接采用。","2026-11-08",17,{"path":808,"title":809,"description":810,"date":811,"series":739,"seriesOrder":812},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-16","软件分析与设计笔记 16：从 persona 到 URS：一份交付物的完整骨架","把前面十几篇串成一份能交出去的东西：用户需求规格说明书的九个部分、每一章来自哪个环节、由谁确认，以及面向决策者的提案该讲清哪三件事。","2026-11-07",16,{"path":814,"title":815,"description":816,"date":817,"series":739,"seriesOrder":818},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-15","软件分析与设计笔记 15：非功能需求：把「快、稳、安全」变成数字","为什么「系统要快」不是一条需求：非功能需求怎么量化，决定性能的用户量、交易量、数据量三张表怎么估，安全需求要写清什么，以及可靠性的「不可用」该怎么定义。","2026-11-06",15,{"path":820,"title":821,"description":822,"date":823,"series":739,"seriesOrder":824},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-14","软件分析与设计笔记 14：软件测试：层级、方法与等价类划分","「我们测过了」这句话问题在哪：为什么静态评审和动态测试缺一不可，五个测试层级各自验证什么，白盒与黑盒的差别，以及用等价类划分和边界值把无限输入变成有限用例的方法。","2026-11-05",14,{"path":826,"title":827,"description":828,"date":829,"series":739,"seriesOrder":830},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-13","软件分析与设计笔记 13：需求获取：五种调查方法与一场访谈","需求从哪里来：五种事实调查方法各自适合回答什么、代价是什么，访谈从准备到记录的全过程，问卷设计里最容易犯的错，以及访谈记录必须写下来的那几项信息。","2026-11-04",13,{"path":832,"title":833,"description":834,"date":835,"series":739,"seriesOrder":836},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-12","软件分析与设计笔记 12：前端设计：把流程变成屏幕","界面设计不是「画得好看」：从活动图走到屏幕的三步，CRUD 任务流怎么当检查表，界面必须回答的三个问题，信息架构与五种导航类型，视觉一致性与留白，以及移动端与 Web 端的差别。","2026-11-03",12,{"path":838,"title":839,"description":840,"date":841,"series":739,"seriesOrder":842},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-11","软件分析与设计笔记 11：Agentic AI 与业务流程自动化","AI agent 到底是什么：五项能力与四个核心组件，什么场景该用定时任务、什么该用程序、什么才值得用 agent，两种实现路径的差别，必须提前防住的四类失败模式，以及设计方法从提示词到编排的演进。","2026-11-02",11,{"path":844,"title":845,"description":846,"date":847,"series":739,"seriesOrder":848},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-10","软件分析与设计笔记 10：精炼用例模型：include、extend 与泛化","三种精炼用例关系的判断标准：include 什么时候用、它和 extend 的区别到底在哪、参与者泛化与用例泛化各解决什么问题，以及精炼到什么程度就该停手。","2026-11-01",10,{"path":850,"title":851,"description":852,"date":853,"series":739,"seriesOrder":854},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-09","软件分析与设计笔记 09：功能需求（二）：从流程到业务实体","活动图画完之后，怎么从流程里筛出真正的业务实体：三条判断标准、哪些名词其实不该建实体、属性从哪里来，以及领域模型和后面的数据模型分别负责什么。","2026-10-31",9,{"path":856,"title":857,"description":858,"date":859,"series":739,"seriesOrder":365},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-08","软件分析与设计笔记 08：功能需求（一）：用例模型与活动图","从用户故事到用例的翻译过程：什么才算「好」的参与者，系统边界怎么划，用例描述必须写清哪四件事，活动图怎么把分支、并行与泳道画清楚，以及这两个图在 draw.io 里各用哪个形状、最容易画错哪一笔。","2026-10-30",{"path":861,"title":862,"description":863,"date":864,"series":739,"seriesOrder":359},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-07","软件分析与设计笔记 07：用户故事：把需求写成可验收的一句话","用户故事的三段结构，怎么从用户画像和数据地图里把它提取出来，一条故事多大算合适、时序为什么也是需求的一部分，以及验收标准怎么写才算真的可验收。","2026-10-29",{"path":866,"title":867,"description":868,"date":869,"series":739,"seriesOrder":335},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-06","软件分析与设计笔记 06：范围界定（数据侧）：用数据校验你的判断","访谈结论和数字对不上时该怎么办：分析的四个层次分别在回答什么问题、为什么不能跳级、数据准备与搜集怎么做成一张应用地图，以及数据最容易在哪几个地方骗你。","2026-10-28",{"path":871,"title":872,"description":873,"date":874,"series":739,"seriesOrder":307},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-05","软件分析与设计笔记 05：范围界定（用户侧）：用户画像与客户旅程图","为什么「所有用户」是一个陷阱，项目边界该怎么划，用户画像要写哪五个要素、最容易写成什么废纸，客户旅程图怎么把阶段、想法和情绪画在同一张纸上，以及怎么从这两样东西一步步推到可验证的需求。","2026-10-27",{"path":876,"title":877,"description":878,"date":879,"series":739,"seriesOrder":298},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-04","软件分析与设计笔记 04：接手陌生案例的第一步：三问与一张表","拿到一个完全陌生的业务案例，怎么从零开始不跑偏：只问 Who、What、Why 三个问题，把「问题—事实—假设—理由」记成一张四列表，说清为什么假设必须写明理由，以及带着问题进访谈为什么比空手去有效得多。","2026-10-26",{"path":881,"title":882,"description":883,"date":884,"series":739,"seriesOrder":285},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-03","软件分析与设计笔记 03：Agile 与 Scrum：迭代、角色与产出物","从「三周做完交付，客户说这不是我要的」讲起，说清瀑布式与迭代式的根本差别，Scrum 的三个角色和三种产出物，一个 sprint 里四次固定活动各自在解决什么问题，以及敏捷里最常见的几个误解。","2026-10-25",{"path":886,"title":887,"description":888,"date":889,"series":739,"seriesOrder":270},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-02","软件分析与设计笔记 02：设计思维、用户驱动与数据驱动","从「客服要一个能一次看完所有排期的界面」这个翻车案例讲起，说清设计思维到底是什么、用户驱动与数据驱动各自能看见什么又看不见什么、为什么真正的落点是把两者合起来的 data-informed design，以及访谈中怎么问出有用的信息。","2026-10-24",{"path":891,"title":892,"description":893,"date":894,"series":739,"seriesOrder":92},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-01","软件分析与设计笔记 01：课程地图与从需求到设计的主干","这一篇不写具体方法，先把整条链路铺开：软件分析与设计到底要解决什么问题，从需求到设计分成哪两段，中间有哪十几个环节，一份完整的交付物里应该有什么，以及后面 27 篇笔记怎么排、新人该按什么顺序读。","2026-10-23",{"path":896,"title":897,"description":898,"date":899,"series":900,"seriesOrder":92},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-01","Spring 学习笔记 01：IoC、依赖注入与第一个 Spring Boot 应用","从「手写 new 出来的三层结构」的痛点讲起，说清 IoC 容器、Bean 与依赖注入是怎么回事，再用 Maven 与 Spring Initializr 跑起第一个能返回 JSON 的应用。","2026-10-15","Spring 学习笔记",{"path":902,"title":903,"description":904,"date":899,"series":900,"seriesOrder":270},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-02","Spring 学习笔记 02：Spring Data JPA 基础——实体映射与 Repository","用 ORM 把类映射到表：@Entity、@Id、@GeneratedValue 怎么用，CrudRepository 三层接口怎么选，H2 与 MySQL 怎么配，以及 ddl-auto 到底该写哪个值。",{"path":906,"title":907,"description":908,"date":899,"series":900,"seriesOrder":285},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-03","Spring 学习笔记 03：JPA 查询——派生方法、JPQL 与分页排序","Repository 自带的方法只够按主键查，这篇讲三种自己造查询的方式：方法名派生、@Query 写 JPQL、原生 SQL，以及 Pageable 分页排序和投影返回。",{"path":910,"title":911,"description":912,"date":899,"series":900,"seriesOrder":298},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-04","Spring 学习笔记 04：JPA 关联映射与仓储测试","一对多、多对多怎么映射，谁负责维护外键，FetchType 与 CascadeType 该怎么选，顺带用 @DataJpaTest 与 AssertJ 把仓储层测起来。",{"path":914,"title":915,"description":916,"date":899,"series":900,"seriesOrder":307},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-05","Spring 学习笔记 05：Spring MVC 与 Thymeleaf 入门","一次页面请求在 Spring MVC 里走了哪几步，@Controller 怎么把数据交给模板，@PathVariable 与 @RequestParam 怎么取参数，以及控制器为什么必须是无状态的。",{"path":918,"title":919,"description":920,"date":899,"series":900,"seriesOrder":335},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-06","Spring 学习笔记 06：表单绑定与服务端校验","把表单字段绑到对象上，用 Bean Validation 注解做服务端校验，把错误信息显示回用户刚填的那一页，再补上自定义校验注解与全局异常处理。",{"path":922,"title":923,"description":924,"date":899,"series":900,"seriesOrder":359},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-07","Spring 学习笔记 07：Thymeleaf 片段复用与国际化","用 th:fragment 与 th:insert\u002Fth:replace 把导航栏、页脚抽成片段，页面套用统一布局，再用 messages.properties 与 LocaleResolver 做中英文切换。",{"path":926,"title":927,"description":928,"date":899,"series":900,"seriesOrder":365},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-08","Spring 学习笔记 08：HTTP Session 与会话状态管理","HTTP 无状态带来的问题，Cookie 与 Session 怎么分工，Spring 里读写会话的几种方式，以及会话固定、超时、多实例共享这些必须想清楚的事。",{"path":930,"title":931,"description":932,"date":899,"series":900,"seriesOrder":854},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-09","Spring 学习笔记 09：拦截器 HandlerInterceptor","登录检查、权限判断、请求耗时统计这类横切逻辑该放哪：HandlerInterceptor 的三个回调各在什么时机执行，怎么注册与排除路径，以及它和过滤器的分工。",{"path":934,"title":935,"description":936,"date":899,"series":900,"seriesOrder":848},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-10","Spring 学习笔记 10：Service 层与事务","一组数据库操作要么全成功要么全失败，靠 @Transactional 怎么做到；传播行为、隔离级别、回滚规则怎么选，以及自调用失效、乐观锁悲观锁这些实战里的坑。",{"path":938,"title":939,"description":940,"date":899,"series":900,"seriesOrder":842},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-11","Spring 学习笔记 11：REST API 基础——把 Service 暴露成接口","同一套 Service 怎么同时服务页面和客户端：@RestController 的路由与方法语义、状态码怎么给、DTO 怎么定，以及 MockMvc 端到端和切片测试的两种写法与各自的坑。",{"path":942,"title":943,"description":944,"date":899,"series":900,"seriesOrder":836},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-12","Spring 学习笔记 12：REST 进阶——版本、更新、跨域与文档化","接口能跑通之后要处理的几件事：URL 与响应结构怎么定、版本怎么演进、更新怎么做到可安全重试、CORS 怎么配、HATEOAS 与 Spring Data REST 该不该用。",{"path":946,"title":947,"description":948,"date":949,"series":950,"seriesOrder":298},"\u002Fposts\u002Fjava\u002Fjava-functionalprogramming-notes","Java 函数式编程笔记：Lambda、函数式接口与 Streams","学习 Java 函数式编程时的个人笔记：Lambda 表达式的五步简写与方法引用、常见函数式接口、Stream 流水线与惰性求值，以及创建流、中间操作、终止操作与收集器的用法。示例代码均为自写，运行结果来自本地实测。","2026-10-13","Java 学习笔记",{"path":952,"title":953,"description":954,"date":949,"series":950,"seriesOrder":285},"\u002Fposts\u002Fjava\u002Fjava-generics-notes","Java 泛型笔记：泛型方法、有界类型与泛型类","学习 Java 泛型时的个人笔记：从重复的重载方法与多态尝试讲起，再到泛型方法与类型推断、有界泛型类型、Comparable 与 Number 边界，以及泛型类在集合中的用法。示例代码均为自写，运行结果来自本地实测。",{"path":956,"title":957,"description":958,"date":959,"series":726,"seriesOrder":298},"\u002Fposts\u002Fmysql\u002Fmysql-learning-04","MySQL 学习笔记 04：数据操纵（增删改）","MySQL 学习笔记第四篇：INSERT 插入（含批量插入与 INSERT ... SELECT）、UPDATE 更新、DELETE 删除，以及各自的坑。","2026-10-10",{"path":961,"title":962,"description":963,"date":959,"series":726,"seriesOrder":307},"\u002Fposts\u002Fmysql\u002Fmysql-learning-05","MySQL 学习笔记 05：DDL 概览","MySQL 学习笔记第五篇：数据定义语言概览——Schema、Table、View、Index、Constraints 这几类对象分别对应哪些 CREATE \u002F ALTER \u002F DROP 命令。",{"path":965,"title":966,"description":967,"date":959,"series":726,"seriesOrder":335},"\u002Fposts\u002Fmysql\u002Fmysql-learning-06","MySQL 学习笔记 06：CREATE TABLE 与数据类型","MySQL 学习笔记第六篇：CREATE TABLE 的完整语法、常用数据类型的选型建议，以及外键的两种定义方式。",{"path":969,"title":970,"description":971,"date":959,"series":726,"seriesOrder":359},"\u002Fposts\u002Fmysql\u002Fmysql-learning-07","MySQL 学习笔记 07：索引","MySQL 学习笔记第七篇：索引的作用与 B+ 树结构、单列与复合索引的创建、索引的代价与适用场景。",{"path":973,"title":974,"description":975,"date":959,"series":726,"seriesOrder":365},"\u002Fposts\u002Fmysql\u002Fmysql-learning-08","MySQL 学习笔记 08：DROP 与 ALTER","MySQL 学习笔记第八篇：DROP 删除数据库对象、ALTER 修改表结构，以及常见的坑。",{"path":977,"title":978,"description":979,"date":959,"series":726,"seriesOrder":854},"\u002Fposts\u002Fmysql\u002Fmysql-learning-09","MySQL 学习笔记 09：约束与数据完整性","MySQL 学习笔记第九篇：SQL 约束——NOT NULL、CHECK、PRIMARY KEY、FOREIGN KEY 等如何保证数据完整性，以及它们的对比。",{"path":981,"title":982,"description":983,"date":959,"series":726,"seriesOrder":848},"\u002Fposts\u002Fmysql\u002Fmysql-learning-10","MySQL 学习笔记 10：视图","MySQL 学习笔记第十篇：视图（Views）的定义与特性、和表的对比、创建与使用，以及可更新视图的限制。",{"path":985,"title":986,"description":987,"date":959,"series":726,"seriesOrder":842},"\u002Fposts\u002Fmysql\u002Fmysql-learning-11","MySQL 学习笔记 11：存储过程","MySQL 学习笔记第十一篇：存储过程（Stored Procedures）的概念、创建与调用、带参数的写法，以及优缺点。",{"path":724,"title":5,"description":719,"date":718,"series":726,"seriesOrder":92},{"path":990,"title":991,"description":992,"date":718,"series":726,"seriesOrder":270},"\u002Fposts\u002Fmysql\u002Fmysql-learning-02","MySQL 学习笔记 02：SELECT 查询与过滤","MySQL 学习笔记第二篇：SELECT 的基本语法与逻辑执行顺序，WHERE 过滤（比较、LIKE、IN、BETWEEN、NULL）、各种 JOIN、UNION 与子查询。",{"path":994,"title":995,"description":996,"date":718,"series":726,"seriesOrder":285},"\u002Fposts\u002Fmysql\u002Fmysql-learning-03","MySQL 学习笔记 03：聚合、分组与输出控制","MySQL 学习笔记第三篇：COUNT\u002FSUM\u002FAVG 等聚合函数、GROUP BY 分组、HAVING 过滤、ORDER BY 与 LIMIT，以及一条 SELECT 的完整逻辑执行顺序。",{"path":998,"title":999,"description":1000,"date":1001,"series":950,"seriesOrder":270},"\u002Fposts\u002Fjava\u002Fjava-oop-notes","Java 面向对象笔记：类、继承、多态与异常","学习 Java 面向对象编程时的个人笔记：类与对象、封装与访问修饰符、继承与多态、集合、抽象类与接口、异常处理。示例代码均为自写，运行结果来自本地实测。","2026-10-06",{"path":1003,"title":1004,"description":1005,"date":1006,"series":950,"seriesOrder":92},"\u002Fposts\u002Fjava\u002Fjava-basics-notes","Java 基础语法笔记：从环境安装到方法与数组","学习 Java 基础语法时的个人笔记：JDK 安装、输入输出、变量与运算符、条件与循环、字符串、数组与方法。示例代码均为自写，运行结果来自本地实测。","2026-10-05",{"path":1008,"title":1009,"description":1010,"date":1011,"series":1012,"seriesOrder":92},"\u002Fposts\u002Fgit\u002Fgit-install-and-basics","Git 安装与基本使用","从装好 Git 到跑通日常提交流程，把最常用的几条命令和它们背后的三个区域讲清楚。","2026-10-04","Git 入门",{"path":1014,"title":1015,"description":1016,"date":1011,"series":1012,"seriesOrder":270},"\u002Fposts\u002Fgit\u002Flocal-remote-repository","本地远程仓库的部署","用自己的机器当 Git 服务器：建一个裸仓库、走 SSH 连上去，把本地提交推上去。",{"path":1018,"title":1019,"description":1020,"date":1011,"series":1021,"seriesOrder":92},"\u002Fposts\u002Fguide\u002Fguide-file-layout","文件都放在哪","文章、图片、封面分别放在仓库的什么位置，哪些目录可以放手改、哪些碰了会出问题。","博客使用指南",{"path":1023,"title":1024,"description":1025,"date":1011,"series":1021,"seriesOrder":270},"\u002Fposts\u002Fguide\u002Fguide-frontmatter","frontmatter 每个字段是什么意思","文章开头那段被横线包住的字段，逐个说明作用、默认行为和写错的后果。",{"path":1027,"title":1028,"description":1029,"date":1011,"series":1021,"seriesOrder":285},"\u002Fposts\u002Fguide\u002Fguide-markdown","正文怎么写 —— Markdown 与排版效果","标题、链接、图片、代码、表格分别怎么写，以及本站对它们做了哪些自定义处理。",1793268153259]