ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据库概念结构设计:先画ER图再建表,才能少走弯路

数据库概念结构设计:先画ER图再建表,才能少走弯路 1. 概念结构设计解决的最大问题先建模再建表1.1 数据库设计全流程里它卡在哪个环节前两天在群里看到有人问MySQL 装好了命令也学了不少可真到自己建表的时候完全不知道从哪儿下手。这个场景我太熟了。很多人花大力气搞定安装配置、背 SQL 语法结果一碰到真正的业务表要么字段缺东少西要么外键乱挂一气等业务跑了几个月才发现结构不对再想去改牵一发动全身比推翻重来还痛苦。数据库设计这件事正规流程其实是四个阶段挨着走的需求分析、概念结构设计、逻辑结构设计、物理结构设计。MySQL 安装好了只是把最后那个“物理环境”准备好了真正决定数据库好不好用的是前两步。概念结构设计就是第二步它干的事非常纯粹把业务里涉及的对象、对象的特征、对象之间的关系用一套与数据库软件无关的模型表达出来。你用的是 MySQL 还是 PostgreSQL这个概念模型都一样因为它描述的是业务本身不是技术实现。我经常打一个比方概念结构设计相当于画户型图逻辑结构设计相当于出施工图物理结构设计才是决定用混凝土还是木头盖。很多人一上来就问“这个字段用 VARCHAR 还是 TEXT”“要不要建索引”这就好比户型还没定就先纠结瓷砖用多大规格方向完全整反了。1.2 ER模型三要素实体、属性、联系怎么理解概念结构设计的产出物绝大多数情况下是一张 ER 图Entity-Relationship Diagram实体-联系图。ER 图就三样东西实体、属性、联系。实体Entity是业务里可以独立区分的对象比如学生、商品、订单、用户。它的判断核心是“有没有必要单独存一组信息”。属性Attribute是实体在某方面的特征比如学生的学号、姓名、专业商品的名称、价格、库存。联系Relationship是实体之间的业务关联比如学生“选修”课程、用户“下单”订单、订单“包含”商品。这里有个特别容易绕进去的点实体和属性不是绝对的。同样一个“地址”在 A 系统里可能就是用户的一个属性填 VARCHAR 就完事但如果业务流程里一个人有多个地址或者需要按省份做统计那“地址”就应该被升级成实体。所以概念设计的过程本质上是在做业务信息的分类和边界划分。这一步做得越扎实后边建表就越顺。1.3 为什么很多人跳过它之后都在返工直接跳过概念设计去建表不是不能跑但跑起来之后全是坑。最常见的三种后果字段冗余到失控、外键关系经不起推敲、业务一扩展就要 ALTER TABLE 改结构。我见过一个实际的项目订单表里有一个字段叫“备注”运维人员往里写“客户要求换货已退款下次注意”。这哪是字段这是操作记录。正确做法应该是把这类信息拆成独立的操作流水表否则等你想统计“这个月有多少订单退款过”SQL 写得想摔键盘。再说一个更常见的多值属性硬塞进单字段。比如用户有多个联系电话新手直接用一个字段存“138xxxx,139xxxx,140xxxx”查询的时候用 LIKE 去匹配数据耦合得一塌糊涂。概念设计阶段如果把“一个用户可以有多个联系电话”这个规则在模型层面显式标出来后面根本不会犯这种错。说白了概念结构设计是成本最低的纠错环节。在纸上把模型画错了改一笔就行等表都建好数据都灌进去发现结构不对要迁移数据、改应用、做兼容成本翻几十倍。所以我才一直跟团队强调写第一句 CREATE TABLE 之前先把概念模型理清楚这不叫耽误时间叫省钱。2. 实体识别实操从业务需求里捞出真正该建模的对象2.1 需求调研阶段不要只盯着现有表格看做实体识别第一步不是画图而是把业务需求摸透。很多人的做法是拿着业务方的 Excel 报表或者是旧系统的导出结果直接照着定义表结构。这是偷懒也是最容易埋雷的做法。报表里展示的字段是业务加工之后的结果不是原始数据。比如财务报表里有个“本月销售额”到了数据库里你不会真的建一张字段叫“本月销售额”的表吧你得拆成订单表、订单项表然后通过聚合计算出来。概念设计阶段真正要做的是把业务流程里每个节点会产生、使用、修改的信息全部列出来再从小到大一层一层归拢。需求来源一般有这么几个业务流程文档、线上表单、线下报表、系统访谈记录。不要忽略访谈业务方嘴里冒出的每一句业务规则都可能影响模型。比如客服提了一句“用户下单时可能要开发票”这句话如果漏了等系统上线再补发票功能订单、支付、物流全要联动改。概念设计阶段把这种规则摊开后边就不会被动。我习惯在需求调研阶段用一个笨办法拿一张大白纸把业务方提到的所有名词都记下来不管是“订单”“商品”“发票”“仓库”还是“客户等级”“优惠券”先不管它最后是实体还是属性统统写下来。这一步做到位了后边筛选才有素材。2.2 判断一个“名词”要不要当实体的三条标准名词收集了一大堆之后筛选就是关键。我总结了三句话每次做实体识别都拿这个去套。第一它有没有独立存在的意义。订单项离开订单还存在吗不存在它是订单的组成部分是弱实体。但商品离开订单还是存在的所以商品是独立实体。第二它有没有一组需要被单独查询、统计或约束的信息。用户的收货地址如果有多个并且业务上需要“查询某个用户的所有地址”那地址就该是实体而不是用户表里的一个字段。反过来商品的“颜色”如果只是展示用没有按颜色筛选、统计的需求那就老老实实当属性。第三粒度合适不合适。一个“用户登录记录”的系统日志“登录记录”是不是实体如果你的业务需要分析登录频次它就是如果只是出问题的时候翻一眼你可以暂时不当。实体不是越多越好多一个实体就多一份维护成本关键看业务到底用不用。还有一个反向坑把操作当实体。比如“订单状态”不是一个实体它是订单的属性“订单状态变更记录”才可能是实体因为一组状态变更历史需要持久化和查询。判断标准就是你关心的是“当前是什么状态”还是“状态是怎么一路变过来的”。前者是属性后者是实体。2.3 属性识别里最容易被带偏的三种情况属性识别看着简单实际最容易踩坑的有三种。一是复合属性要不要拆。最典型的就是地址一个地址里含省、市、区、详细门牌号。如果业务只需要展示完整地址那存一个字符串就行但如果后续要按省份统计订单量就必须拆成独立字段。什么叫“必须”就是你在概念模型里不拆到了数据库照样得加列到时候已经在线上跑的数据又要迁移又是折腾。所以判断依据永远是业务需不需要对某一部分做筛选、统计或约束。二是多值属性怎么处理。一个人有多个电话号码一个订单可能有多个物流单号。最懒的处理是塞进一个字段里用逗号分隔。这写法在 Excel 里挺顺手在 MySQL 里就是个灾难你想查“包含某个手机号的用户”只能 LIKE %13xxxx%一旦号码换了顺序你的查询还可能查重、漏查。概念模型里遇到多值属性一定要问自己一句这个属性会不会被单独拿出来用会就把它建模成子实体或联系。三是派生属性要不要保留。订单总金额可以由订单项金额加运费算出来那要不要在订单表里存一个“订单总金额”概念设计阶段可以画出来但必须标注“派生属性”告诉所有人这个值不是业务原始产生的。逻辑设计阶段再决定是查询时实时计算还是用冗余字段加更新逻辑。最怕的是概念模型里不标逻辑设计时随手建了列然后没人负责维护最后总金额和明细对不上数据直接失去可信度。3. 联系设计一对多、多对多到底怎么判断和落笔3.1 一对一联系的真实用途实体之间的联系就三种一对一、一对多、多对多。一对一在真实业务里其实不多见但也别忽略。什么时候会出现真正意义上的一对一比如用户和用户扩展信息表一张表存登录账号、密码、状态另一张存昵称、头像、生日、个人简介。逻辑上每个用户只有一份扩展信息拆成两张表纯粹是为了冷热数据分离。这种在一对一联系里属于“完全参与”因为每个用户都有扩展信息至少业务上预期是这样。还有一种情况比如“一个订单对应一个发票”如果发票信息确实和订单信息生命周期一致、查询频率差异不大那更合理的做法可能是直接合并成一个实体而不是硬拆两颗。概念设计阶段遇到一对一我一般会多问一句拆开的理由是什么如果说不出来干脆合并。如果是因为信息量太大、更新频率明显不同才考虑保留一对一。3.2 一对多从两个方向数一遍就清楚了一对多是数据库设计里最常用也最好判断的联系。判断方法特别简单从两个方向各数一遍。问“一个班级最多有几个学生”——多个再问“一个学生最多属于几个班级”——一个。答案组合起来就是 1:N。反过来“一个用户下几个订单”——多个“一个订单属于几个用户”——一个这就是典型的用户-订单 1:N。注意这里要区分“最多”和“通常”。有时候业务上“一个订单通常只有一个用户”但极端情况下会不会有合并付款、代下单这种例外概念设计阶段就要把业务规则确认清楚别想当然。与其将来改表不如现在就问一个人能不能替别人下单如果系统不允许那确实是 1:N如果允许模型就要重新考虑。另一个判断技巧是抓业务语言里的关键词一个、多个、每、各、分别、属于。业务人员说“一个用户可以有多个订单”的时候你已经知道这是一对多“多个订单可以合并成一个包裹发货”的时候你面对的可能是多对一甚至要多考虑一层包裹实体。3.3 多对多先别慌概念模型阶段有专门处理多对多也很常见一个学生可以选多门课程一门课程可以被多个学生选一个用户可以收藏多件商品一件商品可以被多个用户收藏一个订单可能包含多个优惠券一个优惠券也可能被多个订单使用如果允许叠加的话。新手最容易在碰到多对多的时候手忙脚乱直接在两张表里各加一个外键指向对方。比如学生表加 course_id课程表加 student_id看着好像“两边都关联了”实际上查出来一团乱一个学生选了两门课学生表里那一行往哪里放第二个 course_id要么塞逗号要么学生表重复两行没有一个是正常的关系型数据形态。概念模型阶段正确的处理方式很朴素先把多对多原样画出来用一个菱形联系把两端的实体连起来不用着急想着怎么落表。转逻辑设计时多对多会自然演变成一张中间表也叫关联表。比如学生-课程之间多对多会得到选课表选课表里既有 student_id 又有 course_id还可以放成绩这种联系属性。这在 MySQL 里反而更简单、更清晰。所以遇到多对多不要怕它其实是设计里最容易照顾到业务扩展性的地方。凡是“多”到“多”的就是需要第三方实体来记录关系的地方这个概念一定在 ER 阶段就贯彻下去。3.4 联系上的属性不能挂错地方联系这个东西最妙的地方在于联系本身可以有属性。学生选修课程这个“选修”联系上有“成绩”员工参与项目这个“参与”联系上有“角色”和“参与时间”用户领取优惠券这个“领取”联系上有“领取时间”和“使用时间”。联系属性最大的坑就是挂错地方。把“选修成绩”挂到学生实体上会出现一个学生选 10 门课、学生表里成绩字段没法表示的情况挂到课程实体上更离谱课程表里放 50 个学生的成绩字段直接爆炸。唯一合理的做法是把它挂在“选修”这个联系旁边。在 MySQL 里落地时联系属性就是中间表的普通字段。选课表里有 student_id、course_id再加上 score。这张表记录的既不是学生本体也不是课程本体而是“学生-课程关系”的明细数据。这个思维一旦建立起来后面建表的思路就通透了多对多联系转化成中间表联系属性就放到中间表上逻辑清晰查询也不别扭。4. 一个电商订单系统的概念结构设计完整案例4.1 业务规则先摆出来别急着画框框理论讲再多不落地都是空的。我带大家完整走一遍概念结构设计一个中小型电商系统后端用 MySQL业务规则如下用户有姓名、手机号、注册时间一个用户可以有多个收货地址。一个用户可以下多个订单一个订单只属于一个用户。订单有下单时间、订单状态、运费。一个订单包含多个订单项订单项记录商品数量、购买时的单价。同一商品可以被不同订单项引用但订单生成之后商品价格修改、商品删除都不能影响订单项里的历史数据。一个订单对应一条物流主单物流可以产生多条轨迹记录。商品归属于分类一个分类下可以有多个商品。订单可能需要开票发票信息含类型、抬头、金额。这些规则看着简单每一条落到模型上都可能有分支。先别急着画框框画线先把规则读三遍标出所有可能影响结构设计的点比如“多个收货地址”意味着地址要做实体“购买时单价”意味着订单项里必须冗余快照“多个轨迹记录”意味着物流轨迹要做子表。4.2 第一版实体与联系草案看看会踩哪些坑按 3.2 的方法先列出第一版实体用户、分类、商品、订单、订单项、地址、物流轨迹、发票。然后列实体之间的联系用户 — 地址1:N用户 — 订单1:N订单 — 订单项1:N商品 — 订单项1:N一个商品可以出现在多个订单项一个订单项对应一个商品分类 — 商品1:N订单 — 物流轨迹1:N订单 — 发票1:1这个草案看着挺完整但如果你经历过几个真实项目一眼就能看出好几个隐患。第一个是订单金额去哪里了第二个是订单项里的单价从哪里来第三个是发票和订单是不是真的一对一。这些隐患不解决到了逻辑设计阶段全是雷。我自己做评审的时候有一个习惯每画完一版就把每个实体上的属性列一遍然后从另一端反向问这个属性有没有可能对应多个值。如果你发现“一个订单项需要记录多个商品的优惠分摊金额”OK这个规模要变。第一版就是要粗糙但粗糙不等于漏洞核心结构不能错。4.3 评审迭代五个典型问题在这里被揪出来第一版模型拿到手里逐条过业务规则立刻会发现五类典型问题。第一订单金额是不是该直接建模成属性我的判断是保留但必须标注“派生属性”。订单总额 所有订单项金额之和 运费。如果设计阶段不标清楚建表时随手加个字段之后没人负责更新总有一天总额和明细对不上。正确的做法是在订单实体上保留该属性标注派生来源逻辑设计阶段再决定用虚拟列、触发器还是查询计算。第二订单项的单价。商品表里有现价但商品价格会变。订单项是历史行为的快照它必须记录“下单那一刻的成交单价”和商品表的当前价格是两回事。所以订单项实体上要有“购买快照价”这个属性不能依赖关联查询实时取商品价格。第三商品删除对订单项的影响。如果商品被下架删除历史订单里的订单项不能断链。这里就要标记商品 — 订单项为“部分参与”意思是并非每个订单项都能在商品表中找到对应记录逻辑设计时外键就不能加严格的级联删除约束。第四物流轨迹是弱实体。轨迹记录离开订单没有任何意义它的存在完全依附于订单所以它是依赖订单的弱实体。在概念模型里要明确没有订单就不会有轨迹。第五发票不一定是 1:1。业务上可能出现退部分款、开部分发票的情况一个订单拆成多张发票完全合理。把订单 — 发票改成 1:N 更稳如果将来业务收紧确认永远一张订单只开一张全额票再缩回来也不难。4.4 定稿后的实体、属性与联系清单评审完定稿的概念模型大致如下实体关键属性与哪些实体联系联系类型用户用户ID、姓名、手机号、注册时间地址、订单1:N地址地址ID、省、市、区、详细地址、收件人用户N:1分类分类ID、分类名称商品1:N商品商品ID、名称、现价、库存、分类ID分类、订单项1:N订单订单ID、下单时间、状态、运费、总额派生用户、订单项、物流轨迹、发票多个 1:N订单项订单项ID、数量、快照单价、小计派生订单、商品N:1物流轨迹轨迹ID、时间、地点、状态描述订单N:1发票发票ID、类型、抬头、金额、开票时间订单N:1这个清单已经是概念设计收尾的样子了。到这一步你手里的模型应该能让业务方看懂他们能看到自己业务里的对象和关系不需要懂任何 MySQL 技术细节。这也是概念结构设计最重要的验收标准业务人员对着图能点头说“对这就是我们业务的样子”。5. 概念模型转 MySQL 逻辑模型外键、子表和字段怎么落5.1 三种联系类型对应的建表形态概念模型定稿后就开始进入逻辑结构设计也就是把 ER 模型翻译成 MySQL 关系模式。三种联系对应三种建表手法。一对一原则上外键放哪边都行但我一般放访问更频繁的那边或者放在“可能为空”的相反侧。比如用户和用户扩展信息扩展表里放 user_id 外键这样用户主表清爽查主信息不会多出无关列。一对多外键一定放在多的一端也就是 N 端。订单和订单项的关系里订单项表加 order_id 外键。注意外键列类型必须和主键完全一致否则 join 用到索引时性能直接打折这是一个特别容易踩的细节。多对多必须产生中间表。比如用户收藏商品收藏表里有 user_id、product_id、收藏时间。中间表要不要单独给自增主键我的建议是加MySQL 里 InnoDB 是聚簇索引表有主键性能更稳而且 ORM 框架对单主键的兼容性普遍比复合主键好。如果你业务上有极强的唯一性要求比如一个用户对一个商品只能收藏一次那就再加一个唯一索引 (user_id, product_id)两者不冲突。5.2 复合属性、多值属性、派生属性在 MySQL 里的落地策略概念模型里标出来的三种特殊属性在 MySQL 里各有各的落法。复合属性比如地址拆成省、市、区、详细地址落地就是四个普通字段province、city、district、detail_address。要不要这么拆取决于 2.3 说的有没有按地区筛选统计的需求。没有就一个 address 字段搞定有就拆拆出来还能顺便用索引优化查询。多值属性比如用户的多个联系电话落地就是一张子表contact(id, user_id, phone, type)type 用来区分手机号、座机、紧急联系人。注意子表的外键列一定要建索引否则反查用户电话时全表扫数据量一大就卡。派生属性在 MySQL 里有两种选择。第一种是干脆不落库查询时用 SUM 实时算第二种是落库并在业务层维护比如订单总额。MySQL 8.0 还有生成列功能可以用虚拟列存储计算表达式但要注意建索引的限制。这里我的真实建议是能用查询算的尽量用查询算实在扛不住性能再加冗余字段而且一定要在字段注释里写明来源逻辑。别让后接手的人看着一个总金额字段不知道它是怎么来的。5.3 命名字段和定主键时的几个实际建议逻辑模型确定后命名规范之前就要定好。概念模型里叫“订单号”“用户编号”到了 MySQL 里统一转小写下划线order_id、user_id、created_at。外键命名我习惯用“另一端表名单数 _id”比如订单表里的 user_id含义一目了然将来 join 的时候不用猜。主键类型这块MySQL 单机业务用 BIGINT UNSIGNED AUTO_INCREMENT 最省心。注意两点一是别用 INT 省空间现在业务量起来特别快INT 上限 21 亿看着多真到接近上限时改字段类型是一场灾难二是分布式、分库分表场景下要考虑雪花 ID 之类的分布式 ID这个在设计评估时就当问题抛出去别等上线了才后悔。还有数据类型的选择逻辑结构设计阶段虽然会涉及但我的原则是先别过度纠结。VARCHAR 和 TEXT 的区别、字符集选 utf8mb4 还是 utf8这些可以在物理设计阶段再定。逻辑设计核心是把概念模型里的“属性”映射成“字段”把“联系”映射成“外键”和“中间表”过早陷入类型细节容易忽略结构本身的问题。6. 常见错误与排查技巧评审概念模型时问什么6.1 高频错误速查表现象、原因、正确做法概念结构设计这一步的错误大多数都出在实体/属性/联系的边界判断上。我把这些年见过的高频问题整理了一张速查表。错误现象根本原因概念模型里的正确做法一个字段存多个手机号把多值属性当普通属性建模成子实体或联系两张表互相加外键表示多对多把 M:N 误设计成两表互指ER 阶段保留菱形联系逻辑阶段建中间表成绩字段挂在课程表上联系属性挂错端挂在学生-课程联系上所有业务对象都做成实体混淆数据持久化与界面元素看实体是否有独立信息和查询需求订单金额存两处经常对不上派生属性冗余无生成规则标注派生属性明确更新策略实体没有候选主键属性粒度没设计好回到需求找到能唯一标识业务对象的属性把“状态”和“状态变更记录”混成一个实体混淆当前值和历史值状态是属性状态变更是实体这张表不是背下来的它是每一次评审时逐步沉淀的。你团队里每犯一次新错误就往表里加一行时间长了这就是最值钱的设计规约。6.2 评审ER图时必问的六个问题画完概念模型评审环节一定不能省。我自己每次评审必问六个问题问完之后模型质量基本就稳了。第一有没有两个实体其实是一回事比如“客户”和“会员”可能是同一批人的两种视角。合并还是区分要业务给出明确答案。第二有没有一个实体在模型中出现了两次且联系也重复比如“创建订单”和“支付订单”如果都连到用户和订单但本质上是订单状态的变化那就不该拆成两段联系。第三有没有“实体”实际上只是属性比如“订单备注”如果只在一个实体上出现没别处引用它就不该成为实体更不该建表。第四每个实体是不是都能找出主键候选找不出来说明这个实体的属性粒度有问题或者它根本不是实体。第五反过来读一遍所有联系从每个实体出发顺着联系说一遍业务看看能不能像讲一个流畅的故事。比如“用户创建订单订单包含订单项订单项对应商品”。如果哪句的语义不通八成是模型有偏差。第六有没有把技术实现细节混进概念模型概念模型里出现“主键”“外键”“索引”这些词就说明你提前进入了逻辑设计。先退回去把业务层的东西理清楚。6.3 小项目如何低成本完成概念设计我知道很多人看到“概念结构设计”几个字就觉得重、麻烦尤其是只有三五张表的小项目。我的观点是方法论可以缩放但不能跳过。小项目不需要画多正式的 ER 图。一个最简做法找张白纸或打开一个在线表格列两栏左边写“实体”右边写“实体下的属性”实体之间用一句话描述联系。比如“用户 1 对多 订单订单 1 对多 订单项”。把这些写清楚花十分钟。但这十分钟能换来什么换来的是你写 CREATE TABLE 时有据可依换来的是业务方跟你确认规则时有文档可以指认。更小的项目甚至可以直接在聊天工具里把实体清单发给业务方问三句话这些对象对不对有没有少关系理解有没有错业务方点个头你再动工建表心理踏实很多。我见过很多“小项目”后来长成了“大项目”几张表变几十张表。如果你一开始就把概念模型这层地基打好了后面的扩展基本是加实体、加联系而不是改结构、迁数据。这笔账怎么算都划算。7. 工具选型与落地经验用什么画概念模型更顺手7.1 几款常用建模工具的真实使用感受画 ER 图的工具我基本用了个遍简单说说真实感受。纸笔和白板永远是我最推荐的起点。概念设计阶段的核心动作是讨论、推翻、再讨论画在白板上的模型可以随手擦改大家一起看效率远高于盯着屏幕。等模型基本稳了再移步到电子工具保存。draw.io 是我用得比较多的免费工具浏览器打开就能画ER 图模板齐全导出成 SVG、PNG 都方便团队协作时还能存到网盘共享。画实体框、连线、标注联系属性这些操作都在面板上没什么学习成本。如果你习惯用文本画图可以试试 Graphviz 那一路的 DOT 语言或者 PlantUML 这类把 ER 模型脚本化的方式。好处是模型可以进 Git 版本管理每次改动都有记录Review 时看 diff 也直观。不过这类工具画画简单的模型还好实体一多排版调整会让人有点头疼。MySQL Workbench 里有 EER 图功能我反而不太建议拿它做概念设计。它的建模工具和物理表结构强绑定你从 MySQL Workbench 画出来的东西天然会偏向逻辑模型很容易让你不知不觉开始考虑字段类型、索引这些细节。概念模型阶段最好跟具体的数据库产品保持距离。7.2 概念设计文档完成后怎么做才不算白做模型画完图存好这只是第一步。真正让概念结构设计发挥价值的是后续维护和沟通。我有个习惯概念模型定稿之后把最终版打印出来贴工位或者放到团队文档的置顶位置。不是摆样子而是因为业务总在变今天加个字段明天多一种联系。当你在物理表层面发现改动时一定要同步回概念模型。否则过两三个月概念模型和真实数据库完全对不上这张图就彻底成了废纸大家也不再信任它。另外每次设计评审的时候从概念模型讲起。DBA、后端、产品经理坐在一起产品讲业务诉求后端讲数据结构DBA 讲落库策略三拨人对着同一张概念模型图对齐比直接开会过字段清单高效得多。概念模型就是团队之间的共同语言这件事的价值在协作场景里体现得特别明显。7.3 一些想对刚入门朋友说的话我刚接触数据库设计那会也犯过直接建表的毛病觉得画概念模型是浪费时间不如早点把表建出来跑通功能。后来被一个线上事故教育了一顿订单表结构没想清楚导致后面加“发货单”功能时改了五天还被业务方投诉加急。从那以后我不管多急的项目都要先在脑子里过一遍“实体—属性—联系”这三板斧。如果你现在正准备开发一个新项目或者接手一个老系统要重构数据库别急着敲 MySQL 命令。把业务规则写下来把实体列出来把关系整理清楚哪怕只用十分钟你后面建的表都会比直接拍脑袋写得稳。MySQL 装好是工具就位概念结构设计想清楚才是真正的开工。MySQL 的面试题里也常出现“什么是概念结构设计”“ER 模型怎么画”但我更在意的是能不能在真实项目里把这一套用出价值。方法不难难的是每次都坚持做。第一次可能不习惯做到第三个项目的时候你就会发现返工少了、沟通顺了、代码也不用来回改了。这就是概念结构设计带给你的最大回报。
返回列表