咱后端开发写 SQL 前要是没建模,改表结构时简直想掀桌子!这篇博客就用接地气的话讲透数据库建模,从 CDM/PDM 概念到 PD 工具实操,连案例带 SQL 导出一步到位,新手也能秒懂~
一、为啥要搞数据库建模?这可不是没事找事🤔
咱先唠个扎心场景:刚写好的用户表上线 3 天,产品突然说要加 "会员等级";又过一周,运营说订单得关联 "优惠券"------ 改表、改 SQL、改业务代码,一套操作下来人都麻了。
数据库建模就是 "建表前画图纸" :先想清楚系统里有哪些 "东西"(比如用户、商品)、它们有啥属性(比如用户名、价格)、互相啥关系(比如一个用户能下多个订单)。提前把图纸画明白,后期改需求才不会手忙脚乱!
二、两大核心模型:CDM 和 PDM 的爱恨情仇💑
这俩兄弟经常被搞混,但分工超明确 ------ 一个管 "业务",一个管 "落地"。
1. 概念模型 CDM:给产品经理看的 "草图"📝
核心定位:只讲 "业务逻辑",不管 "技术实现"。比如电商场景的 CDM 长这样:
- 实体(Entity):用户、商品、订单(就是系统里的核心 "东西")
- 属性(Attribute):用户有 "用户名、手机号",商品有 "名称、价格"(不用管字段类型)
- 关系(Relationship):用户→订单(一对多,一个用户能下 N 个订单)、商品→订单(一对多)
灵魂拷问:CDM 里需要写 "id 是 int 类型" 吗?答:不用!它只给业务、开发、测试对齐需求用,相当于 "咱们先统一想法,再谈怎么造"。
2. 物理模型 PDM:给数据库看的 "施工图"🔧
核心定位:把 CDM 翻译成 "数据库能懂的语言",是建表的直接依据。还是电商场景:
- 实体→表(用户实体→user 表)
- 属性→字段(用户名→username varchar (50) NOT NULL)
- 关系→主键 + 外键(订单表加 user_id,关联用户表的 id)
关键区别:PDM 得明确数据库类型(MySQL/Oracle)、字段长度、索引、约束 ------ 毕竟 MySQL 的 varchar 和 Oracle 的 varchar2 可不一样!
三、建模神器 PowerDesigner(PD):老大哥级工具✨
提到建模工具,PD 称第二没人敢称第一(虽然界面有点复古,但功能是真能打)。咱重点讲 "从画图到导出 SQL" 的核心操作,新手也能快速上手。
四、PD 实操三步走:列实体→填属性→画关系🚀
以 "简化版电商系统" 为例,手把手教你玩明白:
Step1:列实体(Entity)------ 先把 "演员" 请出来
- 打开 PD,新建 "Conceptual Data Model"(选 CDM,别选错!)
- 左边工具栏点「Entity」(小矩形图标),画布上点一下输入名称:User(用户)、Product(商品)、Order(订单)
- 注意:实体名建议用英文,后期转表名不用改(咱后端人得有这职业素养~)
Step2:填属性(Attribute)------ 给 "演员" 穿衣服
- 双击 User 实体,弹出属性窗口点「Add」
- 依次填属性:
-
- id(标识符,就是主键,勾上 "Primary Identifier")
-
- username(必填,业务属性)
-
- phone(可选,加个 "Optional")
- 同理给 Product 加 id、name、price;给 Order 加 id、create_time
Step3:画关系(Relationship)------ 让 "演员" 互动起来
- 左边工具栏点「Relationship」(折线图标)
- 先点 "User" 实体,再点 "Order" 实体 ------ 弹出窗口选 "One to Many"(一对多),确定!
- 再连 "Product" 和 "Order",同样选 "一对多"
- 效果:画布上会显示 "1→N" 的关系线,清晰明了~
五、从画图到导出 SQL:最后一步封神🎯
1. CDM 转 PDM:一键翻译功能🔄
- 菜单栏选「Tools」→「Generate Physical Data Model」
- 弹出窗口选数据库类型(比如 MySQL 8.0),其他默认,点 OK
- 魔法时刻:CDM 的 User 实体直接变成 PDM 的 user 表,属性自动映射字段类型(比如 String→varchar (255))
👉 避坑提醒:PD 默认的字段长度可能不合理(比如手机号 varchar (255)),转完后记得双击表,手动改成 varchar (20)!
2. 导出 SQL:直接给数据库喂饭🍚
- 切换到 PDM 界面,菜单栏选「Database」→「Generate Database」
- 选导出路径(比如桌面),文件名填 "ecommerce.sql"
- 点「Generate」------ 搞定!打开 SQL 文件就是现成的建表语句:
sql
-- 导出的MySQL表结构示例
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`user_id` int(11) NOT NULL COMMENT '关联用户ID',
`product_id` int(11) NOT NULL COMMENT '关联商品ID',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
六、完整案例:简化版电商建模全流程✅
1. CDM 设计(业务对齐阶段)
实体 | 核心属性 | 关系 |
---|---|---|
User | id、username、phone | 1→N 关联 Order |
Product | id、name、price | 1→N 关联 Order |
Order | id、create_time | N→1 关联 User/Product |
2. PDM 设计(落地阶段)
表名 | 字段名 | 类型 | 约束 |
---|---|---|---|
user | id | int(11) | PK, AUTO_INCREMENT |
username | varchar(50) | NOT NULL | |
phone | varchar(20) | DEFAULT NULL | |
product | id | int(11) | PK, AUTO_INCREMENT |
name | varchar(100) | NOT NULL | |
price | decimal(10,2) | NOT NULL | |
order | id | int(11) | PK, AUTO_INCREMENT |
user_id | int(11) | FK→user.id | |
product_id | int(11) | FK→product.id | |
create_time | datetime | DEFAULT CURRENT_TIMESTAMP |
3. 最终效果
PD 里画完的图清爽明了,导出的 SQL 直接能在 MySQL 里执行 ------ 建表一步到位,再也不用对着需求瞎猜字段了!
七、最后唠两句掏心窝的💡
- 新手别一开始就追求 "完美模型":先画核心实体和关系,再补次要属性(比如后期加 "用户头像" 再更模型)
- CDM 一定要拉产品一起评审:避免 "开发觉得对,产品觉得错" 的悲剧
- PD 快捷键安利:Ctrl+S(随时保存!)、F4(编辑实体 / 表)、Ctrl+R(刷新视图)