逻辑模型 vs 物理模型 核心区别(结合C#、ORM、数据库讲解)
逻辑模型 vs 物理模型 核心区别(结合C#、ORM、数据库讲解)
一、一句话核心差异
- 逻辑模型:只关心业务、程序层面的数据结构,和数据库无关;
- 物理模型:关心数据在硬盘上怎么存,完全绑定具体数据库(SQLite/SQLServer)。
二、全方位对比表格
| 对比维度 | 逻辑模型 | 物理模型 |
|---|---|---|
| 设计目标 | 描述业务实体、属性、实体之间的关系 | 把逻辑结构翻译成数据库真实存储结构 |
| 关注点 | 业务含义、字段作用、一对多/多对多关联、业务非空校验 | 字段类型、长度、主键、自增、索引、字符集、默认值、表名 |
| 是否依赖数据库 | 完全不依赖,换数据库不用改逻辑模型 | 强依赖,SQLite和SQLServer语法不一样,物理结构要改 |
| 典型载体 | 纯C#实体类、DTO、领域Model、无数据库标记 | 建表SQL、ORM带映射特性的实体、数据库索引脚本 |
| 数据类型写法 | 只写通用类型:long、string、DateTime | 数据库专属:BIGINT、VARCHAR(20)、DATETIME |
| 有无存储优化设计 | 无(不考虑性能、索引) | 有:普通索引、唯一索引、分表、分区 |
| 变更影响 | 业务逻辑变更才会修改 | 换数据库、优化性能、调整字段长度都会修改 |
三、代码实例直观区分
1. 纯逻辑模型(只写业务,无任何数据库信息)
// 逻辑模型:只定义业务属性和关联,不关心数据库怎么存
public class Operator
{
public long Id { get; set; }
public string Name { get; set; }
public string Pwd { get; set; }
public DateTime CreateTime { get; set; }
// 一对多业务关系
public List<OperateLog> Logs { get; set; }
}
特点:看不到表名、字段长度、主键标记,这段代码放到任何数据库都不用改。
2. 物理模型(增加数据库存储细节)
// 物理层映射,绑定SQLite存储规则
[SugarTable("tb_operator")] // 数据库真实表名
public class Operator
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)] // 物理主键、自增
public long Id { get; set; }
[SugarColumn(Length = 20, IsNullable = false)] // varchar(20) 不允许为空
public string Name { get; set; }
[SugarColumn(Length = 64, IsNullable = false)]
public string Pwd { get; set; }
[SugarColumn(DefaultValue = "CURRENT_TIMESTAMP")] // 数据库默认值
public DateTime CreateTime { get; set; }
}
配套物理产物(建表SQL):
CREATE TABLE tb_operator(
Id BIGINT PRIMARY KEY AUTOINCREMENT,
Name VARCHAR(20) NOT NULL,
Pwd VARCHAR(64) NOT NULL,
CreateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_name ON tb_operator(Name);
四、关键区别总结
-
粒度区别
逻辑只定义“有什么字段”;物理定义“这个字段占多大空间、用什么类型、要不要建索引”。 -
复用性区别
逻辑模型通用,MySQL、SQLite、SQLServer一套实体都能用;
物理模型和数据库绑定,换库就要调整长度、自增、字段类型。 -
职责分层(开发规范)
- 业务层、DTO、领域实体 = 逻辑模型,只处理业务;
- ORM映射配置、数据库表、索引 = 物理模型,只处理存储。
- 冗余与范式
逻辑模型只遵守业务三范式;
物理模型为了性能可以打破范式(冗余字段)、增加索引。
五、最简单记忆口诀
逻辑:只管业务数据长啥样;
物理:管数据库硬盘怎么存。

浙公网安备 33010602011771号