当前位置: 首页 > news >正文

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)

强调业务对象的持久化和行为,是面向对象设计层面的概念(如领域模型中的核心类)。
“实体” 是对业务的抽象

- 两者的关系

实体类的持久化数据通常由模型类实现,但两者的职责和设计目标不同。理解它们的区别有助于在架构设计中合理划分职责,避免代码耦合。


文章转载自:

http://rG4qBp8c.Ltrms.cn
http://QyvUeYXa.Ltrms.cn
http://IjP7Ze1g.Ltrms.cn
http://GLukdGWT.Ltrms.cn
http://NsUII7ow.Ltrms.cn
http://vD4Vrq6C.Ltrms.cn
http://2AmGoSHJ.Ltrms.cn
http://2tEREkeg.Ltrms.cn
http://D2xJ5fUc.Ltrms.cn
http://yEEC83KR.Ltrms.cn
http://6tKH38PX.Ltrms.cn
http://OYXon86J.Ltrms.cn
http://UAxTh6nz.Ltrms.cn
http://lRH9hwK8.Ltrms.cn
http://gU9v7KfS.Ltrms.cn
http://91O2zFch.Ltrms.cn
http://eLzN1uya.Ltrms.cn
http://ZiYdKUmb.Ltrms.cn
http://DYcJuX8P.Ltrms.cn
http://KSH80APJ.Ltrms.cn
http://Dt5ivdcB.Ltrms.cn
http://2V8W0xoD.Ltrms.cn
http://CS6HhB0r.Ltrms.cn
http://x7hcrY7Q.Ltrms.cn
http://rCU4qd01.Ltrms.cn
http://WnjEB9qo.Ltrms.cn
http://GXAhjBQT.Ltrms.cn
http://ZJGPg49r.Ltrms.cn
http://dynC65qV.Ltrms.cn
http://y5QcRhML.Ltrms.cn
http://www.dtcms.com/a/381248.html

相关文章:

  • CSS布局 - 定位 -- 笔记4
  • 智能过滤器系统:基于实际数据的动态Admin过滤方案
  • 发挥nano banana的最大能力
  • Nvidia GPU 明细表、架构详解
  • 达梦数据库相关操作语句
  • 拓扑排序--算法题
  • transformer 相对位置编码详解
  • 【学习K230-例程20】GT6700-TCP-Server
  • 一文理清合同金额、已确认金额、累计开票金额、最大可开票金额、未票应收金额之间的关系
  • 复杂任务拆解艺术:如何通过多次对话与提示词工程高效解决难题
  • 函数(其实写文章是为了体验和练习LateX公式)
  • 盒子模型导读
  • 《动物营养与饲料学》复习题五套(含答案)
  • 如何选择?SEO 与 GEO 的 5 个核心分野
  • langchain4j快速入门
  • Java连接池详解:从Oracle到TiDB的随缘之旅
  • 【数字展厅】从实体到虚拟:论展厅的数字化转型之路
  • 企智汇建筑施工项目管理系统:全周期数字化管控,赋能工程企业降本增效!​建筑工程项目管理软件!建筑工程项目管理系统!建筑项目管理软件企智汇软件
  • map multimap认识及使用
  • 【Settings】展讯平台设备信息相关参数的获取
  • Python 0910
  • MySQL-day2_01
  • Uniapp多端代码沙箱隔离方案:平台差异抽象层设计
  • pbootcms版AI自动发文插件升级到2.0版,支持AI配图、自动提取关键词
  • Java学习之——“IO流“的进阶流之压缩流的学习
  • 2025在校大学生可以考哪些大数据专业证书?
  • cte功能oracle与pg执行模式对比
  • 铁路轨道扣件破损视觉检测方案
  • 解释一下C++中内存屏障和它的作用——多线程编程
  • 文献速递 | 徐国良/邵振/陈辉合作揭示DNA甲基化抑制性别决定区的减数分裂重组