ORM框架SQLAlchemy工具:模型类(Model Class)和实体类(Entity Class)介绍
文章目录
- **1. 模型类(Model Class)**
- **命名来源**
- - **"模型"** 一词来源于数学和工程中的 **模型(Model)** 概念,表示对现实世界的抽象和简化。在软件开发中,"模型"通常指对数据结构的抽象,例如:
- **核心特点**
- - **与ORM框架关联**:模型类通常是ORM(如SQLAlchemy、Django ORM)中的核心概念,用于描述数据库表的结构。
- - **关注数据结构**:模型类的职责是**定义数据的存储格式**和与数据库的映射关系。
- - **技术实现层面**:模型类是代码中的具体实现,用于生成SQL语句、操作数据库。
- **示例(以SQLAlchemy为例)**
- **2. 实体类(Entity Class)**
- **命名来源**
- **核心特点**
- - **与业务逻辑关联**:实体类的职责是**封装业务规则和状态**,而不仅仅是数据存储。
- - **持久化特性**:实体类通常需要长期存储在数据库中(持久化),其生命周期与数据库记录一致。
- - **设计模式层面**:实体类是面向对象设计中的核心概念,属于 **实体-控制-边界(ECC)** 模式中的 **实体类**。
- **示例(以业务逻辑为例)**
- **3. 为什么两者名称不同?**
- **4. 两者的关联与区别**
- **关联**
- **区别**
- 1. **职责不同**:
- 2. **设计层级不同**:
- 3. **命名习惯不同**:
- **5. 为什么有时候会混用这两个术语?**
- - **技术实现与业务设计的重叠**
- - **框架命名习惯**
- **6. 总结**
- - **模型类(Model Class)**:
- - **实体类(Entity Class)**:
- - **两者的关系**:
模型类(Model Class)和实体类(Entity Class)这两个术语在软件开发和数据建模中经常被使用,但它们的 命名来源和应用场景略有不同。以下是它们的命名逻辑和区别:
1. 模型类(Model Class)
命名来源
- “模型” 一词来源于数学和工程中的 模型(Model) 概念,表示对现实世界的抽象和简化。在软件开发中,"模型"通常指对数据结构的抽象,例如:
- 数据库模型:将数据表、字段、关系等抽象为代码中的类和属性。
- 领域模型:将业务逻辑中的核心概念(如用户、订单)抽象为类。
核心特点
- 与ORM框架关联:模型类通常是ORM(如SQLAlchemy、Django ORM)中的核心概念,用于描述数据库表的结构。
- 例如:
User
类对应users
表,类的属性对应表的字段。
- 关注数据结构:模型类的职责是定义数据的存储格式和与数据库的映射关系。
- 技术实现层面:模型类是代码中的具体实现,用于生成SQL语句、操作数据库。
示例(以SQLAlchemy为例)
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class User(Base): # User 是模型类__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(50))email = Column(String(100))
- 这里的
User
类是一个模型类,它直接与数据库表users
对应。
2. 实体类(Entity Class)
命名来源
- “实体” 一词来源于面向对象设计中的 实体(Entity) 概念,表示具有独立存在意义和持久化特性的对象。实体类通常用于描述业务领域中的核心对象,例如:
- 用户(User)
- 订单(Order)
- 产品(Product)
核心特点
- 与业务逻辑关联:实体类的职责是封装业务规则和状态,而不仅仅是数据存储。
- 例如:用户实体类可能包含验证邮箱格式的方法,或计算用户积分的逻辑。
- 持久化特性:实体类通常需要长期存储在数据库中(持久化),其生命周期与数据库记录一致。
- 设计模式层面:实体类是面向对象设计中的核心概念,属于 实体-控制-边界(ECC) 模式中的 实体类。
示例(以业务逻辑为例)
class User: # User 是实体类def __init__(self, name, email):self.name = nameself.email = emailself.validate_email() # 封装业务规则def validate_email(self):if "@" not in self.email:raise ValueError("Invalid email format")
- 这里的
User
类是一个实体类,它不仅存储数据,还包含业务逻辑(邮箱验证)。
3. 为什么两者名称不同?
维度 | 模型类(Model Class) | 实体类(Entity Class) |
---|---|---|
核心目标 | 描述数据结构,与数据库表映射 | 描述业务对象,封装业务规则和状态 |
技术关联 | 通常与ORM框架(如SQLAlchemy)绑定 | 通常与业务逻辑层(Service层)绑定 |
生命周期 | 存在时间较短(仅在数据库操作时使用) | 存在时间较长(贯穿整个业务流程) |
命名来源 | 来源于"模型"(Model)的抽象概念 | 来源于"实体"(Entity)的业务概念 |
典型场景 | 数据库表的映射(如SQLAlchemy的模型类) | 业务逻辑的核心对象(如用户、订单) |
4. 两者的关联与区别
关联
- 实体类可以通过模型类实现:在ORM框架中,实体类的持久化数据通常由模型类实现。例如:
class User(Entity): # 业务实体类def __init__(self, user_model: UserModel): # UserModel 是模型类self.id = user_model.idself.name = user_model.nameself.email = user_model.email
- 模型类可以包含实体类的行为:在某些框架中,模型类不仅定义数据结构,还可能包含简单的业务逻辑(如字段校验)。
区别
1. 职责不同:
- 模型类:专注数据存储和数据库映射。
- 实体类:专注业务规则和对象行为。
2. 设计层级不同:
- 模型类属于 技术实现层(如数据库访问层)。
- 实体类属于 业务逻辑层(如领域模型)。
3. 命名习惯不同:
- 模型类:常见于ORM框架(如SQLAlchemy、Django ORM)。
- 实体类:常见于面向对象设计(如DDD领域驱动设计)。
5. 为什么有时候会混用这两个术语?
- 技术实现与业务设计的重叠
在实际开发中,模型类和实体类的职责可能重叠。例如:
- 使用SQLAlchemy的模型类时,可能直接在其上添加业务逻辑(如字段校验),此时它既是模型类又是实体类。
- 在业务逻辑中,实体类可能直接依赖数据库模型(如通过注入模型实例)。
- 框架命名习惯
某些框架(如Django)将模型类(Model Class)作为核心概念,而实体类(Entity Class)更多是设计模式的术语,因此开发者可能模糊两者的界限。
6. 总结
- 模型类(Model Class):
强调数据结构与数据库的映射,是技术实现层面的概念(如ORM框架中的类)。
→ “模型” 是对数据的抽象。
- 实体类(Entity Class):
强调业务对象的持久化和行为,是面向对象设计层面的概念(如领域模型中的核心类)。
→ “实体” 是对业务的抽象。
- 两者的关系:
实体类的持久化数据通常由模型类实现,但两者的职责和设计目标不同。理解它们的区别有助于在架构设计中合理划分职责,避免代码耦合。