C# 开发视角:概念模型、逻辑模型、物理模型完整理解
C#开发视角:概念模型、逻辑模型、物理模型完整理解
这三者本质是数据分层设计思想,不只是数据库专用,写C#业务系统、三层架构、ORM(Dapper/SqlSugar/EF)每天都会碰到,从抽象到落地分三层:
一、三层从上到下关系
概念模型(最高抽象) → 逻辑模型(业务结构化) → 物理模型(机器存储实现)
层层细化,一层比一层贴近代码、数据库。
1. 概念模型 Conceptual Model(业务层、需求层)
核心定位
只描述业务实体与业务关系,完全不考虑数据库、不考虑C#类、不考虑字段类型,纯业务语言。
回答:系统里有哪些东西、它们之间是什么关系。
组成元素
实体、实体属性、实体关系(一对一/一对多/多对多)
举例(林业文件管理系统)
- 实体:操作员、文件、文件夹、操作日志
- 关系:一个操作员可以产生多条操作日志;一个文件夹包含多个文件
- 只关心业务含义,不提int、varchar、主键、外键、表结构
C#对应场景
需求文档、业务流程图、ER总图、领域需求描述、DDD领域实体粗划分。
没有任何代码、数据库细节,纯业务沟通模型。
2. 逻辑模型 Logical Model(业务代码/实体类层)
核心定位
把概念模型规范化、结构化,剥离存储细节,面向程序设计,对应C#实体类、DTO、领域Model。
确定:实体有哪些属性、字段含义、约束、关联关系,但不指定数据库类型、长度、存储引擎。
特点
- 标准化,消除冗余(三范式)
- 定义属性名称、业务约束(非空、唯一、枚举值)
- 定义外键关联、导航关系
- 不关心:数据库varchar(50)、自增主键、索引、分区、存储引擎
举例承接上面林业系统
操作员逻辑模型:
- OperatorId:操作员唯一标识
- OperatorName:操作员姓名(不能为空)
- Password:登录密码
- CreateTime:创建时间
关联:日志持有OperatorId关联操作员
C#对应代码(逻辑模型载体)
// 这就是典型逻辑模型:业务实体,只定义业务属性和关联,无关数据库细节
public class Operator
{
public long OperatorId { get; set; }
public string OperatorName { get; set; }
public string Password { get; set; }
public DateTime CreateTime { get; set; }
// 导航属性:一对多关系
public List<OperateLog> Logs { get; set; }
}
- EF Core / SqlSugar 的
Entity实体类 = 逻辑模型 - DTO、ViewModel 也属于业务侧逻辑模型变种
只描述程序层面的数据结构,不绑定数据库存储规则。
3. 物理模型 Physical Model(数据库落地层)
核心定位
逻辑模型映射到真实存储介质(SQLite/SQL Server),完全面向数据库硬件、存储引擎。
增加所有底层存储细节,是最终建表脚本、数据库真实结构。
新增物理层专属信息
- 字段数据类型、长度、精度:
varchar(32)、bigint、datetime - 主键、自增标识、外键约束
- 索引、联合索引、唯一索引
- 字段默认值、是否允许NULL
- 表名、字段名映射、分表、分区、存储引擎
- 字符集、排序规则
承接例子:操作员物理模型(SQLite建表)
CREATE TABLE Operator(
OperatorId BIGINT PRIMARY KEY AUTOINCREMENT,
OperatorName VARCHAR(20) NOT NULL,
Password VARCHAR(64) NOT NULL,
CreateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_operator_name ON Operator(OperatorName);
C#对应场景
- ORM特性标记(映射物理存储规则)
[SugarTable("Operator")] // 物理表名
public class Operator
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)] // 物理主键自增
public long OperatorId { get; set; }
[SugarColumn(Length = 20, IsNullable = false)] // 物理字段长度、非空
public string OperatorName { get; set; }
[SugarColumn(Length = 64, IsNullable = false)]
public string Password { get; set; }
[SugarColumn(IsNullable = false, DefaultValue = "CURRENT_TIMESTAMP")]
public DateTime CreateTime { get; set; }
}
- 数据库迁移脚本、建库语句、索引优化脚本
- 数据库性能调优相关设计(分表、索引、字段压缩)
二、三层模型完整流转(C#开发标准流程)
- 概念模型:和业务、客户沟通,梳理有哪些业务对象、关系(无代码无库)
- 逻辑模型:抽象成C#实体类、领域模型,规范属性、关联、业务校验(只关心程序业务)
- 物理模型:给实体加数据库映射特性,生成建表SQL,设计索引、字段类型,落地到数据库存储
三、一句话区分记忆
- 概念模型:客户看得懂的业务名词(什么东西、有什么关系)
- 逻辑模型:程序员看得懂的C#实体类(程序里数据长什么样)
- 物理模型:数据库看得懂的表结构(硬盘里数据怎么存)
四、常见开发误区
- 混淆逻辑与物理:在实体类里写死数据库长度、索引逻辑,破坏分层,换数据库就要改实体
规范做法:逻辑实体只保留业务属性,物理映射单独用特性/配置类分离 - 跳过概念模型直接建表:需求一变,表和实体全部重构,扩展性极差
- DDD领域实体 = 逻辑模型;数据库表 = 物理模型;需求ER图 = 概念模型
五、拓展:对应三层架构关系
- 概念模型 → 需求层 / 领域需求
- 逻辑模型 → 业务层 Model / DTO
- 物理模型 → 数据访问层(Dapper/EF/SqlSugar)+ 数据库表结构

浙公网安备 33010602011771号