尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
数据库规范化与1NF/2NF/3NF:订单大表拆解实践
第一次见到“范式”这个词的人十有八九会把它和正则表达式扯到一起。我在内部分享会上就被问过“这个正则化是不是写^[a-z]$那种”——不是。数据库语境里的 Normalization标准译名是规范化或者范式化讲的是“一张表该拆成几张表、每个字段该待在哪张表里”这件事。有些教材直译成正则化于是就有了这个容易误解的标题我后面统一用“范式”这个词。这篇内容面向的是刚接手真实业务库、或者正在准备数据库相关面试的人。你大概已经能写 CRUD也能看懂 ER 图但面对一张六十多个字段、里面还塞着逗号分隔 ID 串的大表时心里没底到底该不该拆、拆到什么程度算够。UNF、1NF、2NF、3NF 这条线就是回答这个问题的。我会把每一层“为什么要有这个规则”“违反了会出什么事”“怎么改”讲透最后用一份订单数据从零推到 3NF附上可以直接跑的 DDL。1. 把数据全塞进一张表问题不在于“装不下”1.1 UNF 描述的其实是大多数系统的起点严格说 UNFUnnormalized Form非规范化形式不算一种范式它描述的是“还没开始做任何规范化处理”的状态。这个状态在真实项目里出现的频率远比教科书想象的高常见的三个来源业务方给的 Excel 模板被原样建表、第三方接口返回的 JSON 被拍平直接落库、早期为了赶进度把多个实体的字段堆在一张宽表里。我见过一张典型的 UNF 表长这样订单号客户信息商品明细下单时间客户等级D001张三,138xxxx,杭州苹果x2;香蕉x52024-03-01金卡D002李四,139xxxx,宁波橙子x12024-03-02银卡这张表能存数据也能查出来甚至在数据量小的时候看不出任何毛病。问题在于它是一个“复合体”一行里同时承载了订单、客户、商品三类实体的信息而且商品明细那格还是多值的。一旦业务要求变复杂——比如“查出所有买过苹果的客户”“把张三的手机号改掉”“统计金卡客户的平均客单价”——这张表就开始处处掣肘。1.2 三类异常才是拆表的真正动机教材里讲范式往往先给定义再给例子读起来很抽象。实际工作中推动你拆表的是三种具体的事故学术上叫插入异常、更新异常、删除异常我按真实感受重新描述一遍。插入异常来了一个新客户还没下单你想把他录进系统。但表的主键是订单号没有订单就没有订单号这条客户记录根本插不进去。只能编一个假订单号占位或者干脆等下单时再录。这就是“实体的存在依赖于另一个实体”。更新异常张三的手机号变了你得把这张表里张三出现的每一行都改一遍。如果他有 200 个订单就改 200 行。漏改一行系统里就同时存在两个手机号客服打过去是空号。更麻烦的是你没法用一条 UPDATE 语句保证一致性只能靠人肉或者定时脚本兜底。删除异常D002 这单被取消了DELETE 掉这一行结果李四这个客户的档案、等级、联系方式一起没了。你只是想删一笔订单却顺手删掉了一个客户实体。这三种异常的本质是同一件事一个事实应该只在一个地方存储。UNF 把这些事实挤在一起于是任何一次增删改都可能牵动多个事实。1.3 规范化的目标不是“表越多越好”这里必须先破一个常见误解。很多人学完范式回去看自己的库觉得每张表都不合格然后大刀阔斧拆成十几张结果查询变成七个 JOIN接口响应从 20ms 涨到 300ms线上报警。范式的本质目标是消除冗余和依赖异常不是消除字段数量。判断一张表该不该拆问自己三个问题这个字段描述的是哪个实体它会不会因为别的字段变化而需要同步修改删掉一行会不会连带丢失另一类事实三个问题里有两个答“是”就说明该拆都答“否”哪怕表有八十个字段也不一定有问题。UNF 到 1NF 迈的是第一步也是最容易被忽略的一步处理多值字段。2. 1NF单元格里塞列表代价远高于省下的那张表2.1 原子性怎么判定得看业务怎么用它1NF 的要求是每个字段的值都是原子的不可再分没有重复组每行可以被唯一标识。定义简单难点在于“原子”是相对业务而言的。“收货地址”存成“浙江省杭州市西湖区某路1号”算不算原子如果业务只需要整段打印在快递单上它就是原子的不用拆。但如果运营要按省份做发货时效统计、按城市做运费分区那这个字段就是非原子的必须拆成 province、city、district、detail 四段。同样“商品规格”存成“红色 XL”如果只是展示够了如果要按颜色做库存汇总就得拆成 color 和 size 两列。我踩过的一个坑是早期把“尺寸”存成了“长x宽x高”这种格式后来要做体积筛选和三维装箱计算只能写一堆字符串切割函数SUBSTRING_INDEX嵌套三层慢且容易错。所以判断标准不是“值里有没有分隔符”而是**“这一整块值会不会被单独检索、统计或者更新”**。会就不是原子的。2.2 逗号分隔的 ID 串会在四个地方咬你多值字段最典型的形式是标签串、ID 列表比如tag_ids 3,7,12。这种设计在快速原型阶段特别爽省掉一张关联表写进去也方便。但它会在下面几个场景里集中爆发。第一精确匹配失效。查标签 ID 为 3 的文章直觉写法是LIKE %3%结果把标签 13、30、131 的文章全查出来了。改成LIKE %,3,%又漏掉了首尾的情况得写成CONCAT(,, tag_ids, ,) LIKE %,3,%。这个表达式左边包了函数索引彻底失效全表扫描。第二索引和查询优化器全面失能。FIND_IN_SET(3, tag_ids)语法上比 LIKE 干净但它同样无法使用索引。文章表到百万级以后一次标签筛选就是几百毫秒起步用户点一下筛选项页面就卡住。第三删除和更新变成字符串手术。要把某个标签从所有文章上摘掉得写正则替换或者应用层遍历处理。要是遇到3,13,33这种串替换3的时候一不小心把 13 和 33 也切了。我见过线上出过这种事一次批量脚本把标签关系搞乱最后靠备份回滚。第四聚合统计几乎没法写。“每个标签下有多少篇文章”这个问题在关联表结构里是一条GROUP BY在字符串结构里只能全表拉出来在应用层 reduce。数据量一大内存直接崩。2.3 拆成关联表之后主键怎么定把tag_ids拆出去标准做法是建一张中间表-- 反例文章表里塞标签串 CREATE TABLE article_bad ( id BIGINT PRIMARY KEY, title VARCHAR(200), tag_ids VARCHAR(200) COMMENT 逗号分隔如 3,7,12 ); -- 正例拆成关联表 CREATE TABLE article ( id BIGINT PRIMARY KEY, title VARCHAR(200) NOT NULL ) ENGINEInnoDB; CREATE TABLE article_tag ( article_id BIGINT NOT NULL, tag_id BIGINT NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (article_id, tag_id), KEY idx_tag_article (tag_id, article_id) ) ENGINEInnoDB;几个细节值得说清楚。主键用(article_id, tag_id)的复合主键而不是再加一个自增 ID。原因是这两个字段的业务含义本身就是“某篇文章拥有某个标签”天然唯一加自增 ID 反而多一层无意义的映射还多一个索引的维护成本。同时复合主键自带唯一约束插入重复关系时数据库直接报错省掉应用层的判重逻辑。索引设计上主键(article_id, tag_id)已经覆盖了“查某文章的所有标签”这个方向。反过来“查某标签下的所有文章”走不到这个索引所以额外建一个(tag_id, article_id)的联合索引。注意把 tag_id 放左边因为它是等值查询的驱动列article_id 放右边可以直接走覆盖索引不用回表。这张中间表只有两个业务字段而且两个都是主键的一部分。这意味着它不存在“非主键属性”也就无所谓部分依赖和传递依赖——它天然满足 2NF 和 3NF。这是个很典型的规律拆到最细的关联表往往一步到位满足到 3NF因为里面只剩“谁和谁有关系”这一个事实。3. 2NF只有当主键是复合的这个坑才会显形3.1 部分依赖到底在说什么2NF 的前提是这张表已经满足 1NF并且它的候选键是复合的。在这个前提下要求所有非主键属性都完全依赖于整个候选键而不能只依赖其中一部分。“完全依赖”这个词有点绕用订单明细讲最直观-- 违反 2NF 的订单明细表 CREATE TABLE order_detail_bad ( order_id BIGINT, product_id BIGINT, product_name VARCHAR(100), -- 只依赖 product_id product_price DECIMAL(10,2), -- 只依赖 product_id quantity INT, -- 依赖 (order_id, product_id) order_date DATE, -- 只依赖 order_id PRIMARY KEY (order_id, product_id) );主键是(order_id, product_id)一行代表“某订单里的某个商品”。逐个字段看依赖关系quantity必须知道是哪个订单的哪个商品才有意义这是完全依赖但product_name只要知道product_id就能确定跟订单号没关系这就是部分依赖order_date只要知道order_id就能确定也是部分依赖。部分依赖带来的直接后果是冗余和更新不一致。同一个商品被 5000 个订单买过product_name就在这张表里存了 5000 遍。商品改名得同步更新 5000 行漏一行就出现两个名字。同一个订单有 10 个商品order_date就存了 10 遍改订单日期同样要改 10 行。3.2 自增单列主键的表为什么几乎不会违反 2NF这是很多人的困惑点。翻遍自己的库发现几乎每张表主键都是id BIGINT AUTO_INCREMENT那是不是说明所有表都满足 2NF答案是单列主键的表不可能违反 2NF因为部分依赖的前提是“主键由多个属性组成”。只有一列谈不上“部分”。但这不代表这些表就没问题——它们的问题可能出在 3NF 上也就是非主键字段之间的传递依赖。所以很多团队的实践是“统一用代理主键把 2NF 这一关直接跳过重点管 3NF”。这个做法有代价。用自增代理主键会掩盖业务上的自然键导致重复数据可以插进去。比如(order_id, product_id)这个自然唯一约束如果不额外加UNIQUE KEY同一个订单里同一个商品就能插两条。所以我个人的习惯是代理主键可以有但业务上的自然键必须单独建唯一索引兜底。CREATE TABLE order_detail ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_id BIGINT NOT NULL, product_id BIGINT NOT NULL, quantity INT NOT NULL, UNIQUE KEY uk_order_product (order_id, product_id), KEY idx_order (order_id) ) ENGINEInnoDB;3.3 一个中间表返工的实例早年我做过一个权限系统角色和权限的关联表是这么设计的CREATE TABLE role_permission_bad ( role_id BIGINT, perm_id BIGINT, role_name VARCHAR(50), -- 部分依赖 perm_code VARCHAR(50), -- 部分依赖 granted_by BIGINT, -- 完全依赖 PRIMARY KEY (role_id, perm_id) );当时图省事觉得反正查询要展示角色名和权限编码干脆冗余进来少一次 JOIN。跑了一年多出过一次事故某个角色改名之后代码只更新了role主表忘了同步这张关联表导致权限校验页面上同一个角色出现了两个名字运营以为建了重复角色手工删了一批关联关系最后花了大半天恢复数据。后来拆成三张表role、permission、role_permission(role_id, perm_id, granted_by)。关联表只保留关系本身和关系上的属性谁授权的、什么时候授权的不再携带任何实体的描述性字段。查询确实多了一次 JOIN但那张关联表的数据量在十万级走主键 JOIN 成本可以忽略换来的是改名这件事只需要改一个地方。4. 3NF非主键字段之间的“私下传递”4.1 传递依赖的识别靠画依赖链3NF 在 2NF 基础上多要求一条所有非主键属性都不能传递依赖于候选键。所谓传递依赖就是A → B → C这样的链条A 是主键C 通过 B 间接依赖 A而不是直接依赖 A。学生表是最经典的例子CREATE TABLE student_bad ( sno VARCHAR(20) PRIMARY KEY, sname VARCHAR(50), dept_no VARCHAR(10), dept_name VARCHAR(50) -- 传递依赖sno → dept_no → dept_name );sno确定dept_nodept_no确定dept_name所以dept_name传递依赖于sno。它描述的不是学生这个实体而是院系这个实体。院系改名所有该院系的学生行都要改。识别方法很机械盯着主键问每个非主键字段“它是由主键直接决定的还是由另一个非主键字段决定的”。如果是后者链条就成立了。稍微复杂一点的情况是链条更长比如订单 → 客户 → 客户等级 → 折扣率三级传递这种表拆起来要按链条一层层剥。不是所有冗余都算传递依赖。有一类字段叫派生字段比如订单表里的total_amount它是由明细表汇总而来的。严格从函数依赖看它确实依赖于主键之外的东西但它跨表了所以通常单独讨论叫“派生冗余”。处理方式和传递依赖不同——传递依赖该拆派生冗余看场景后面会讲。4.2 冗余字段引发的三类事故第一类是数据对不上。两个地方存同一个事实只要有一个写入路径漏了同步就会不一致。这类 bug 最恶心的地方在于它不是必现的——正常流程都对只有某条边缘路径后台批量导入、运维手工改数据、某个老接口漏更新然后在几个月后对账时才发现。第二类是更新放大。一个院系有 8000 名学生改一次院系名要 UPDATE 8000 行。如果表上有多个索引每次更新还要维护索引锁的范围大高峰期执行容易造成主从延迟。第三类是删除信息丢失。新建了一个院系还没有学生在这个结构里根本存不进去。等第一个学生录入时院系名才“顺便”被记下来。这又回到了插入异常。拆解方式是把院系抽成独立表CREATE TABLE department ( dept_no VARCHAR(10) PRIMARY KEY, dept_name VARCHAR(50) NOT NULL ) ENGINEInnoDB; CREATE TABLE student ( sno VARCHAR(20) PRIMARY KEY, sname VARCHAR(50) NOT NULL, dept_no VARCHAR(10) NOT NULL, KEY idx_dept (dept_no), CONSTRAINT fk_student_dept FOREIGN KEY (dept_no) REFERENCES department(dept_no) ) ENGINEInnoDB;外键这个约束在实际项目里经常被“性能考虑”关掉我觉得要看场景。高并发写入的核心表确实可以不用数据库外键改由应用层保证但配置类、主数据类的表把外键打开能挡掉大量脏数据收益远大于那点开销。4.3 什么时候可以故意违反 3NF有几类场景我明确不建议硬套 3NF。报表和统计表。数据仓库里的宽表、物化视图、日报周报明细表这些表的存在意义就是“一次查询少 JOIN”冗余是设计目标而不是缺陷。它们的写入通常由 ETL 批量完成不存在并发更新导致的不一致问题只需要保证每次重算覆盖全量。高频读低频写的主数据快照。订单表里通常会冗余一份下单时的收货地址和商品名称。这不是没做范式而是刻意的快照——商品后来改名了、地址后来改了历史订单必须保留下单那一刻的信息。这种情况下必须冗余而且要明确标注字段含义避免后来的人以为是没拆干净又去“优化”掉。需要原子读取的聚合值。比如账户余额它理论上可以由所有流水汇总得出但每次查余额都去 SUM 一遍流水表显然不现实。做法是保留余额字段同时在流水表上记录每次变动用事务保证两者同步更新再配一个定期的对账任务校验。这是典型的“用受控冗余换性能”。判断能不能违反我的标准是三条这个冗余是有意为之还是历史遗留写入路径是否唯一且可控有没有对账或重建机制三条都过可以留有一条不过趁早拆。5. 把一张订单大表从 UNF 推到 3NF 的完整过程5.1 起点一张什么都往里装的表假设接手的是这么一张表来源是早期从 Excel 导入的历史数据CREATE TABLE order_raw ( order_no VARCHAR(32) PRIMARY KEY, customer_str VARCHAR(300) COMMENT 姓名,电话,城市, items_str TEXT COMMENT 商品名x数量;商品名x数量, order_date DATE, cust_level VARCHAR(20), level_rate DECIMAL(4,2) COMMENT 等级对应折扣率 );数据长这样D001 | 张三,13800000001,杭州 | 苹果x2;香蕉x5 | 2024-03-01 | 金卡 | 0.90 D002 | 李四,13800000002,宁波 | 橙子x1 | 2024-03-02 | 银卡 | 0.955.2 第一步打散多值与分段字段到达 1NF1NF 要处理两件事customer_str和items_str都是多值或复合值得先拆成独立字段。同时要给表一个明确的、能唯一标识一行的主键——order_no可以但订单明细一行代表多个商品一张表装不下必须分成主表和明细表。-- 订单主表 CREATE TABLE orders ( order_no VARCHAR(32) PRIMARY KEY, cust_name VARCHAR(50) NOT NULL, cust_phone VARCHAR(20) NOT NULL, cust_city VARCHAR(50) NOT NULL, order_date DATE NOT NULL ) ENGINEInnoDB; -- 订单明细表 CREATE TABLE order_item ( order_no VARCHAR(32) NOT NULL, line_no INT NOT NULL COMMENT 行号同一订单内唯一, product_name VARCHAR(100) NOT NULL, quantity INT NOT NULL, PRIMARY KEY (order_no, line_no) ) ENGINEInnoDB;这里用line_no而不是product_name作为明细的主键组成部分是因为同一订单里可能出现同名的不同规格商品比如“苹果”的两种产地用商品名做主键会撞。行号是最稳妥的行内唯一标识。5.3 第二步拆掉明细表里的部分依赖到达 2NForder_item的主键是(order_no, line_no)。检查每个非主键字段product_name依赖的是商品本身而不是订单或行号。但当前设计里商品没有独立标识先补一个。quantity依赖整行没有问题。引入商品表明细表只保留商品 ID 和数量CREATE TABLE product ( product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL, category_id BIGINT, price DECIMAL(10,2) NOT NULL ) ENGINEInnoDB; CREATE TABLE order_item ( order_no VARCHAR(32) NOT NULL, line_no INT NOT NULL, product_id BIGINT NOT NULL, quantity INT NOT NULL, PRIMARY KEY (order_no, line_no), KEY idx_product (product_id) ) ENGINEInnoDB;此时order_item只剩product_id和quantity两个非主键字段都完全依赖整行2NF 达成。顺带说一句把price放在product表里有个隐患——商品调价后历史订单的金额计算会错。正确做法是在order_item里冗余一个unit_price作为下单快照这是前面说的“受控冗余”属于故意为之。5.4 第三步剥掉订单表里的传递依赖到达 3NForders表里的cust_name / cust_phone / cust_city描述的是客户实体和订单只有“谁下的单”这一层关系。多个订单属于同一客户时这些字段会重复存储客户换手机号要改多行。这是典型的传递依赖order_no → 客户标识 → 客户信息。CREATE TABLE customer ( cust_id BIGINT PRIMARY KEY AUTO_INCREMENT, cust_name VARCHAR(50) NOT NULL, cust_phone VARCHAR(20) NOT NULL, cust_city VARCHAR(50) NOT NULL, level_id BIGINT ) ENGINEInnoDB; CREATE TABLE customer_level ( level_id BIGINT PRIMARY KEY AUTO_INCREMENT, level_name VARCHAR(20) NOT NULL, discount DECIMAL(4,2) NOT NULL ) ENGINEInnoDB; CREATE TABLE orders ( order_no VARCHAR(32) PRIMARY KEY, cust_id BIGINT NOT NULL, order_date DATE NOT NULL, KEY idx_cust (cust_id) ) ENGINEInnoDB;注意level_rate这一列的处理。它同时存在问题一是它描述的是客户等级不是订单二是它又依赖于cust_level构成两级传递。拆成独立的customer_level表后折扣率只存一份调整金卡折扣只需要改一行。5.5 拆完之后的查询对比拆完是五张表orders、order_item、product、customer、customer_level。原来一条查询能拿到的订单详情现在要 JOIN 四张表SELECT o.order_no, o.order_date, c.cust_name, c.cust_phone, l.level_name, l.discount, p.product_name, i.quantity, p.price, i.quantity * p.price AS line_amount FROM orders o JOIN customer c ON c.cust_id o.cust_id JOIN customer_level l ON l.level_id c.level_id JOIN order_item i ON i.order_no o.order_no JOIN product p ON p.product_id i.product_id WHERE o.order_no D001;看着复杂了但每一跳都是主键或索引等值查找实际耗时在毫秒级。而拆之前那条“一个字段里塞客户信息”的查询想按城市统计订单量得靠字符串切分根本没法走索引。性能的账不能只看 JOIN 次数要看执行计划。一个实践中的判断方法如果拆表后某个查询的 JOIN 超过五张先别急着怀疑范式去看是不是少建了索引或者查询本身写得不对。真实业务里超过五表 JOIN 通常意味着报表需求应该走单独的宽表或者读模型而不是硬从主模型里查。6. 范式化的边界哪些表我劝你别硬拆6.1 日志和事件流表天然是宽表埋点日志、操作审计、消息流水这类表写入量极大、几乎不更新、查询以时间范围扫描为主。它们的字段往往是“一次事件发生时的全部上下文快照”比如用户当时的设备、版本、地理位置、页面路径。这些信息如果按范式拆成十几张维度表写入时要做的 JOIN 和查询会非常重而且事件本身不可变根本不存在更新异常。这类表的正确做法是宽表落库配合分区按日期、列式存储如果用分析型数据库以及定期的维度退化处理。不要在写入链路上做规范化。6.2 拆表带来的读放大是真实成本规范化的收益主要在写入侧消除冗余更新、保证一致性成本主要在读取侧更多 JOIN。如果你的系统读远多于写比如内容型产品、商品详情页那么适度的反范式是划算的。常见的折中手段有三个。一是冗余展示字段在列表页主表里冗余商品名、店铺名避免列表页 JOIN这些字段允许短暂不一致用异步任务修正。二是读模型用 CDC 或者定时任务把规范化的主模型同步成一张宽表供查询主模型保持规范查询走宽表。三是物化视图如果数据库支持直接把聚合结果物化下来按需刷新。这三种手段有个共同前提主模型必须是规范化的。因为宽表、读模型、物化视图都是从主模型派生出来的主模型一旦有冗余不一致派生出来的东西全是错的而且排查起来极其困难。6.3 一份可以直接照着走的判断清单下面这张表是我自己用的简化版判断流程对着看就行现象大概率违反处理方式字段里存逗号分隔的 ID 或列表1NF拆关联表复合主键字段里有固定分隔符的复合值且要单独检索1NF拆成多列表用了复合主键且存在只依赖其中一列的字段2NF把该字段连同其依赖列拆成新表单列自增主键的表存在描述另一个实体的字段3NF抽出实体表原表存外键存在 A 决定 B、B 决定 C 的字段链3NF沿着链逐层拆开派生字段汇总值、计算值派生冗余看场景能加对账就留否则改为实时计算历史快照类字段下单时的价格、地址不属于违规明确注释保留还有一点值得单独提醒。很多人学完 1NF 到 3NF会好奇 BCNF、4NF、5NF 在哪。BCNF 处理的是“主键内部还有函数依赖”的边角情况比如一张表有多个候选键且它们互相重叠4NF 处理多值依赖5NF 处理连接依赖。这几层在真实业务里遇到的概率比前三层低得多绝大多数业务表做到 3NF 就够了。真遇到了通常也能从 ER 模型的实体识别阶段就规避掉不需要等到建表后再去套定义。最后分享一个我在评审表结构时的小习惯拿到一张新表先不看字段名只看主键。主键是单列自增的我重点看有没有描述其他实体的字段主键是复合的我逐个字段问它依赖主键的哪一部分。这个动作花不了两分钟但能在建表阶段挡掉大部分后面要返工的坑。
RELATED

相关推荐

paperclip 实战:Node.js + React 构建 AI agent 编排面板

paperclip 实战:Node.js + React 构建 AI agent 编排面板

1. 从“paperclip”这个名字说起:它到底想解决什么问题第一次看到“paperclip”这个项目名,我脑子里蹦出来的画面是办公桌上那枚弯弯的金属回形针。名字起得很朴素,甚至有点反直觉——在满屏都是“Agent”“Copilot”“Auto”这类词的当下&am…

📅 2026/11/3 21:21:17
Univer 实战:Canvas 渲染与插件化架构下的表格文档引擎开发指南

Univer 实战:Canvas 渲染与插件化架构下的表格文档引擎开发指南

1. 从“univer”这个名字说起:它到底想解决什么问题第一次看到“univer”这个词,很多人会下意识联想到“universe”或者“universal”,觉得它大概是个大而全的东西。没错,它确实是一个定位为“通用文档与表格渲染引擎”的开源项目…

📅 2026/11/3 21:21:17
反向学习法:从交付物倒推技能,彻底告别无效学习

反向学习法:从交付物倒推技能,彻底告别无效学习

开头先讲个我最近的真实观察。我有个朋友想学Python,从大半年之前就开始到处找入门教程,把B站上收藏夹加了快一百个视频,各种语法书也买了好几本,结果前阵子我问他写得怎么样了,他说自己还在学列表和字典,连…

📅 2026/11/3 21:21:17
MORE NEWS

更多资讯

📰

Agent 沙箱接入生产实践:选型、持久化与执行协议踩坑指南

1. 从"能跑"到"敢上生产":Agent 沙箱这道坎到底卡在哪如果你正在做 AI Agent 相关的开发,大概率经历过这样一个阶段:本地写个 demo,让 Agent 调用几个工具、跑几段代码,效果挺惊艳,于是…

📰

Vue CLI实现内网大文件分片上传与断点续传方案

1. 内网超大附件上传的挑战与解决方案在企业级应用开发中,内网环境下的大文件上传是个常见但棘手的问题。最近接手的一个内部文档管理系统项目,就遇到了用户需要批量上传数百GB设计稿的需求。传统的单文件上传方式在这里完全失效——浏览器卡死、进度反馈…

📰

HTC老机型刷机全链路:S-ON解锁、Recovery覆盖与RUU救砖

1. 抽屉里那台老 HTC,真正的门槛从来不是“解锁”这一步 每年总有那么几次,会有人抱着一台屏幕已经有点发黄的老机器来找我,说想把它救活。型号多半是 One 系列、Desire 系列或者 Butterfly——这些机器放在今天连当备用机都勉强,…

📰

Model-Optimizer:面向边缘AI的模型压缩与推理加速工程实践

1. 项目概述:这不是一个“一键加速”的魔法按钮,而是一套面向真实推理场景的模型瘦身工程体系 “Model-Optimizer”这个名称乍看像某个商业软件的包装名,但在我过去三年深度参与十几个边缘AI部署项目的实操经验里,它从来不是开箱即…

📰

Paperclip:轻量级 AI Agent 框架实战指南

1. 项目概述:Paperclip 不是回形针,而是一个轻量级 AI Agent 框架你搜“paperclip”时,第一反应可能是办公桌上那个银色小金属片——但在这波 AI 工具浪潮里,Paperclip 是一个真实存在的、开源的、基于 Node.js React 构建的 AI …

📰

产业互联网投资逻辑与核心赛道解析

1. 产业互联网的价值投资逻辑产业互联网的本质是通过数字化技术重构传统产业链条,实现供需精准匹配和资源高效配置。与消费互联网不同,产业互联网具有三个显著特征:一是服务对象从C端转向B端,二是价值创造方式从流量变现转向效率提…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬