不灭的火

革命尚未成功,同志仍须努力 _ 加密SHA/AES/RSA下载JDK17

作者:AlbertWen  添加时间:2025-10-28 12:26:25  修改时间:2025-10-28 23:48:29  分类:03.MySQL/PgSQL/Redis  编辑

一、概念模型、逻辑模型、物理模型 的区别

这三个模型是数据表设计从抽象到具体的核心步骤,核心区别在于抽象程度和落地目标不同。概念模型描述 “业务是什么”,逻辑模型定义 “数据关系怎么建”,物理模型明确 “在数据库里怎么实现”。

1. 概念模型(Conceptual Data Model):描述业务,无关技术

概念模型是最抽象的一层,完全脱离技术,只关注 “业务中有哪些核心实体” 以及 “实体之间的基本关系”,而不涉及任何技术实现细节。它的主要目的是与业务人员、领域专家沟通,确保大家对核心业务概念的理解是一致的。

  • 核心特点

  1. 面向业务:使用业务术语,面向业务场景,比如 “电商购物”“学校选课”,而非具体数据库。
  2. 忽略细节:不关心字段、数据类型、主外键、索引等技术细节。
  3. 描述关系:重点是识别出“谁”和“什么”,以及它们之间“如何关联”。
  4. 常用工具实体-关系图,特别是陈氏表示法。
  • 举例:电商场景的概念模型

    • 核心实体:用户、商品、订单
    • 实体关系:
      • 用户 ↔ 订单:一个用户可以下多个订单(一对多)
      • 订单 ↔ 商品:一个订单可以包含多个商品,一个商品可以在多个订单中(多对多)

2. 逻辑模型(Logical Data Model):定义结构,脱离数据库

逻辑模型是在概念模型基础上的细化,明确 “每个实体包含哪些字段”“字段类型是什么”“主键 / 外键怎么设”,但仍不绑定具体数据库(如 MySQL、PostgreSQL、Oracle等)。它定义了完整的表结构、列、数据类型、主键和外键

  • 核心特点

  1. 面向系统分析员/设计师:是技术人员之间的沟通语言。
  2. 细化结构:将 “实体” 转化为 “表”,“实体属性” 转化为 “字段”,明确 表名、字段的数据类型(如 VARCHAR、INT)和约束(如非空、唯一)。
  3. 规范化:通常需要遵循数据库范式(如第三范式),以减少数据冗余和保证数据一致性。
  4. 描述关系:通过主外键明确表之间的关联。处理多对多关系(通常需新增 “中间表”),但不涉及索引、分区等数据库特有优化。
  • 举例:电商场景的逻辑模型(简化版)
    我们将概念模型转化为具体的表结构,逻辑模型图
     就会是一个详细的、带有字段和连线的ER图,明确标出主外键关系。

表名 字段名 数据类型 约束 说明
用户表(user) user_id  INT 主键(PK) 用户唯一 ID
  user_name  VARCHAR (50) 非空、唯一 用户名
  user_phone  VARCHAR (20) 非空、唯一 手机号
商品表(goods) goods_id  INT 主键(PK) 商品唯一 ID
  goods_name VARCHAR (100) 非空 商品名称
  goods_price  DECIMAL (10,2) 非空 商品价格
订单表(order) order_id INT  主键(PK) 订单唯一 ID
  user_id  INT   外键(FK) 关联用户表 user_id
  order_time  DATETIME  非空 下单时间
订单项表(order_item) item_id INT  主键(PK) 订单项 ID
  order_id INT  外键(FK) 关联订单表 order_id
  goods_id INT  外键(FK) 关联商品表 goods_id 
  buy_num  INT  非空 购买数量

3. 物理模型(Physical Data Model):落地实现,绑定数据库

物理模型是逻辑模型的最终落地,针对具体数据库类型,明确 “表在数据库里怎么建”,包括索引、存储引擎、分区策略等优化细节。

  • 核心特点

  1. 面向DBA和开发者:是具体的实现蓝图。
  2. 依赖特定DBMS:完全绑定具体数据库,比如 MySQL 的InnoDB存储引擎、Oracle 的CHAR类型长度计算规则。数据类型、SQL语法会因MySQL、Oracle等不同而不同。
  3. 考虑性能:增加性能优化项,如索引、分表规则、分区、表空间、存储引擎等,确保数据读写高效。
  4. 考虑存储:可能会设置初始文件大小、文件组等。
  5. 可能反规范化:为了查询性能,可能会有意地增加一些数据冗余,这与逻辑模型的规范化可能相反。
  • 举例:电商场景的物理模型(MySQL 版)以 “订单表(order)” 为例,物理模型会生成具体的 SQL 建表语句,包含数据库特有配置:

CREATE TABLE `order` (
  `order_id` INT NOT NULL AUTO_INCREMENT COMMENT '订单唯一ID',  -- MySQL自增主键
  `user_id` INT NOT NULL COMMENT '关联用户ID',
  `order_time` DATETIME NOT NULL COMMENT '下单时间',
  `order_status` TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态:0-待支付,1-已支付',  -- 新增状态字段(逻辑模型可补)
  PRIMARY KEY (`order_id`) USING BTREE,  -- 主键索引(MySQL默认BTREE)
  KEY `idx_user_id` (`user_id`) USING BTREE,  -- 新增用户ID索引,优化“查用户所有订单”的速度
  KEY `idx_order_time` (`order_time`) USING BTREE  -- 新增时间索引,优化“查某时段订单”的速度
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';  -- 绑定InnoDB引擎、UTF8编码

物理模型的关键决策:

  1. 存储引擎:选择InnoDB(支持事务、外键)。
  2. 字符集:使用utf8mb4以支持存储Emoji表情。
  3. 索引:除了主键和外键自动创建的索引,我们还手动为order.user_id和order.order_time等字段创建了索引,以加速排序和查询。
  4. 级联操作:【外键】定义了当用户被删除时,其所有订单也自动删除(ON DELETE CASCADE)。
  5. 具体数据类型INT for user_id, DATETIME for order_time。

三者核心区别对比

特性 概念模型 逻辑模型 物理模型
目标 理解业务,沟通共识 描述数据结构,规范化设计 具体实现,优化性能
受众 业务人员、产品经理 系统分析师、设计师 DBA、开发人员
关注内容 实体与业务关系 表、字段、数据类型、主外键 表空间、索引、分区、存储引擎、SQL代码
独立性 独立于DBMS和技术 独立于DBMS 依赖于特定DBMS
核心问题 有什么?有什么关系? 有什么表?有什么字段? 如何高效地存储和访问?
产出物 实体关系图(ER 图) 逻辑表结构文档 (数据字典) 建表 SQL、索引设计

简单来说:

  • 概念模型草图,回答“是什么”。
  • 逻辑模型施工图,回答“怎么做”(结构)。
  • 物理模型现场施工,回答“用什么工具和材料具体做”。

二、举例说明

举例整理一份:电商场景完整的三模型设计文档,包含 ER 图、逻辑表结构和 MySQL 建表语句:

以下是电商场景完整的 “概念模型→逻辑模型→物理模型” 设计文档,覆盖核心业务流程(用户、商品、订单、支付),方便直接参考落地。

1、概念模型(ER 图)

核心实体:用户、商品、商品分类、订单、订单项、支付记录实体关系

  • 用户 ↔ 订单:1 对多(一个用户可下多个订单)
  • 商品分类 ↔ 商品:1 对多(一个分类包含多个商品)
  • 订单 ↔ 订单项:1 对多(一个订单包含多个订单项)
  • 订单项 ↔ 商品:多对 1(多个订单项可关联同一个商品)
  • 订单 ↔ 支付记录:1 对 1(一个订单对应一条支付记录)

简化 ER 图示意

[用户]1──┐  
         ├─*[订单]1──┐  
[商品分类]1──*[商品]1──┼─*[订单项]*──┘  
                                 └─1[支付记录]  

2、逻辑模型(通用表结构)

表名 字段名 数据类型 约束 / 说明
用户表(user) user_id INT 主键(PK),自增
  username VARCHAR(50) 非空、唯一,用户名
  password VARCHAR(100) 非空,加密存储(如 MD5)
  phone VARCHAR(20) 非空、唯一,手机号
  register_time DATETIME 非空,注册时间
  status TINYINT 非空,默认 1(1 - 正常,0 - 禁用)
表名 字段名 数据类型 约束 / 说明
商品分类表(category) category_id INT 主键(PK),自增
  category_name VARCHAR(50) 非空、唯一,分类名称(如 “电子产品”)
  parent_id INT 允许空,父分类 ID(用于多级分类)
表名 字段名 数据类型 约束 / 说明
商品表(goods) goods_id INT 主键(PK),自增
  goods_name VARCHAR(200) 非空,商品名称
  category_id INT 外键(FK),关联 category 表
  price DECIMAL(10,2) 非空,售价
  stock INT 非空,库存数量
  image_url VARCHAR(500) 允许空,商品图片地址
  create_time DATETIME 非空,创建时间
表名 字段名 数据类型 约束 / 说明
订单表(order) order_id BIGINT 主键(PK),自增
  user_id INT 外键(FK),关联 user 表
  total_amount DECIMAL(10,2) 非空,订单总金额
  order_status TINYINT 非空,默认 0(0 - 待支付,1 - 已支付,2 - 已取消)
  create_time DATETIME 非空,下单时间
表名 字段名 数据类型 约束 / 说明
订单项表(order_item) item_id BIGINT 主键(PK),自增
  order_id BIGINT 外键(FK),关联 order 表
  goods_id INT 外键(FK),关联 goods 表
  buy_num INT 非空,购买数量
  goods_price DECIMAL(10,2) 非空,购买时的单价(快照)
表名 字段名 数据类型 约束 / 说明
支付记录表(payment) payment_id BIGINT 主键(PK),自增
  order_id BIGINT 外键(FK),关联 order 表,唯一
  pay_amount DECIMAL(10,2) 非空,支付金额
  pay_type TINYINT 非空(1 - 微信,2 - 支付宝)
  pay_time DATETIME 非空,支付时间

3、物理模型(MySQL 实现)

针对 MySQL 8.0,包含存储引擎、索引、字符集等数据库特有配置,直接生成可执行的 SQL:

-- 1. 用户表
CREATE TABLE `user` (
  `user_id` INT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` VARCHAR(50) NOT NULL COMMENT '用户名',
  `password` VARCHAR(100) NOT NULL COMMENT '加密密码',
  `phone` VARCHAR(20) NOT NULL COMMENT '手机号',
  `register_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
  `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1-正常,0-禁用)',
  PRIMARY KEY (`user_id`) USING BTREE,
  UNIQUE KEY `uk_username` (`username`) USING BTREE,  -- 用户名唯一索引
  UNIQUE KEY `uk_phone` (`phone`) USING BTREE         -- 手机号唯一索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

-- 2. 商品分类表
CREATE TABLE `category` (
  `category_id` INT NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `category_name` VARCHAR(50) NOT NULL COMMENT '分类名称',
  `parent_id` INT NULL DEFAULT 0 COMMENT '父分类ID(0-顶级分类)',
  PRIMARY KEY (`category_id`) USING BTREE,
  UNIQUE KEY `uk_category_name` (`category_name`) USING BTREE,
  KEY `idx_parent_id` (`parent_id`) USING BTREE  -- 优化多级分类查询
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表';

-- 3. 商品表
CREATE TABLE `goods` (
  `goods_id` INT NOT NULL AUTO_INCREMENT COMMENT '商品ID',
  `goods_name` VARCHAR(200) NOT NULL COMMENT '商品名称',
  `category_id` INT NOT NULL COMMENT '分类ID',
  `price` DECIMAL(10,2) NOT NULL COMMENT '售价',
  `stock` INT NOT NULL COMMENT '库存',
  `image_url` VARCHAR(500) NULL COMMENT '图片地址',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`goods_id`) USING BTREE,
  KEY `idx_category_id` (`category_id`) USING BTREE,  -- 按分类查商品
  KEY `idx_price` (`price`) USING BTREE                -- 按价格筛选
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

-- 4. 订单表
CREATE TABLE `order` (
  `order_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `user_id` INT NOT NULL COMMENT '用户ID',
  `total_amount` DECIMAL(10,2) NOT NULL COMMENT '总金额',
  `order_status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态(0-待支付,1-已支付,2-已取消)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
  PRIMARY KEY (`order_id`) USING BTREE,
  KEY `idx_user_id` (`user_id`) USING BTREE,           -- 查用户的所有订单
  KEY `idx_create_time` (`create_time`) USING BTREE,   -- 查某时段订单
  KEY `idx_order_status` (`order_status`) USING BTREE  -- 按状态筛选订单
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

-- 5. 订单项表
CREATE TABLE `order_item` (
  `item_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
  `order_id` BIGINT NOT NULL COMMENT '订单ID',
  `goods_id` INT NOT NULL COMMENT '商品ID',
  `buy_num` INT NOT NULL COMMENT '购买数量',
  `goods_price` DECIMAL(10,2) NOT NULL COMMENT '购买单价',
  PRIMARY KEY (`item_id`) USING BTREE,
  KEY `idx_order_id` (`order_id`) USING BTREE,         -- 查订单包含的商品
  KEY `idx_goods_id` (`goods_id`) USING BTREE          -- 查商品被哪些订单购买
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单项表';

-- 6. 支付记录表
CREATE TABLE `payment` (
  `payment_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '支付ID',
  `order_id` BIGINT NOT NULL COMMENT '订单ID',
  `pay_amount` DECIMAL(10,2) NOT NULL COMMENT '支付金额',
  `pay_type` TINYINT NOT NULL COMMENT '支付方式(1-微信,2-支付宝)',
  `pay_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '支付时间',
  PRIMARY KEY (`payment_id`) USING BTREE,
  UNIQUE KEY `uk_order_id` (`order_id`) USING BTREE,   -- 确保一个订单只支付一次
  KEY `idx_pay_time` (`pay_time`) USING BTREE          -- 查某时段支付记录
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付记录表';

设计说明

  1. 概念模型:聚焦业务核心实体(用户、商品、订单),用 ER 图梳理关系,让业务方确认 “我们要做什么”。
  2. 逻辑模型:将实体转化为表,明确字段和约束(如用户名校验、订单状态枚举),不考虑数据库差异,解决 “数据结构怎么设计”。
  3. 物理模型:针对 MySQL 优化(如InnoDB支持事务、utf8mb4兼容表情),新增索引提升查询效率(如用户 ID 索引加速查订单),解决 “在数据库里怎么实现”。

 

三、最后,推荐使用 数据建模工具:PDMaas

官方下载:https://www.yonsum.com/Download