Model view controller 如何定义业务模型和数据模型之间的差异?

Model view controller 如何定义业务模型和数据模型之间的差异?,model-view-controller,oop,business-objects,data-objects,Model View Controller,Oop,Business Objects,Data Objects,在讨论面向对象语言的MVC时,我看到这个术语经常被使用,好像这两者之间有着具体的区别。从上下文中我得到的信息是,业务模型执行一个操作来改变数据模型。这是表达差异的正确方式吗 我想让我困惑的是,大多数模型的例子都混合了这两种角色,从表面上看,这样做感觉很自然。更改对象状态的方法通常位于这些对象本身内部。我想我很难想出一个在现实世界中如何工作的例子。更改对象的方法位于对象内部似乎更为自然。有人能更清楚地解释一下吗?业务模型由数据流如何在业务功能中移动组成。这不考虑数据模型,但有助于指导如何存储数据

在讨论面向对象语言的MVC时,我看到这个术语经常被使用,好像这两者之间有着具体的区别。从上下文中我得到的信息是,业务模型执行一个操作来改变数据模型。这是表达差异的正确方式吗


我想让我困惑的是,大多数模型的例子都混合了这两种角色,从表面上看,这样做感觉很自然。更改对象状态的方法通常位于这些对象本身内部。我想我很难想出一个在现实世界中如何工作的例子。更改对象的方法位于对象内部似乎更为自然。有人能更清楚地解释一下吗?

业务模型由数据流如何在业务功能中移动组成。这不考虑数据模型,但有助于指导如何存储数据

数据模型是在考虑数据的情况下构建的——业务模型的逻辑基于流程/程序/只是事情如何完成的流程,数据模型的设计目的是以尽可能最规范的方式构造数据,以反映业务模型的需求。

业务模型和“数据模型”在MVC应用程序中,两者都可以看作是“M”层的子层。它们都与保存和加载数据有关。区别在于,第一个更接近于最终用户对需求和功能的理解,第二个更接近于低级数据库操作

数据模型层始终更依赖于数据在应用程序中持久化的具体方式。从数据库开始(或者不管是什么具体的数据持久化方法——可以是平面文件或XML),它是第一层,也是抽象程度最低的软件层。例如,如果在应用程序上使用Oracle RDBMS,则数据模型是放置任何Oracle特殊性的位置,如特定SQL语句、连接等。这也是实现原子数据操作(例如CRUD SQL语句)的位置。当然,有一些方法可以减少这一层对给定RDBMS的依赖,比如使用某种ORM库,如Hibernate(Java)、NHibernate(.NET)或Doctrine(PHP)

由于“低级别”,应用程序的其余部分不应直接使用数据模型。这就是商业模式的作用

业务模型被置于一个更高的抽象级别。它实现了封装应用程序所需的所有功能需求的服务

业务模型不应该依赖于特定的RDBMS——它应该使用数据模型来完成这项工作。另一个区别是,它公开的方法粒度较小——不是CRUD内容,而是更复杂、依赖于业务的功能。当然,它也不应该依赖于表示层(视图和控制器)

例如,基于文本值更改单个员工工资的方法可能属于数据模型(考虑到最终用户不允许使用此类功能)。但在给定百分比上增加所有工资的方法肯定属于业务模型(它可以迭代所有员工,并首先使用“单个员工更新”,例如,数据模型方法来实现此规则)


但请记住,这是一个“按书”的描述-现实世界的情况是不同的。有时我们可能不需要两个不同的数据层——例如,ActiveRecord模式既可以用作数据模型类,也可以用作业务类。在这种情况下,您可以将两个层混合到一个层中,但我绝对不建议在更复杂的场景中采用这种方法。

MVC实现中的模型是或应该是业务模型

业务模型描述与应用程序相关的业务实体的行为和属性。当您对其进行编码时,实体将成为类,行为和属性将分别作为这些类的方法和属性

应用程序需要某个地方来存储其信息。如果内存是无限的,我们就永远不会停电,我们的操作系统也永远不需要重启,那么商业模式就足够了。然而,在现实世界中,我们需要将类的属性存储在应用程序和/或计算机关闭后仍能生存的地方

因此,业务模型需要并使用某种类型的数据存储。数据存储的组织方式是数据模型。在大多数情况下,关系数据库是首选的数据存储,因此数据模型通常是关系数据库的设计

虽然数据模型可以处于逻辑级别,然后更接近于OO业务模型,但在本文中,我们通常讨论逻辑模型的技术实现。(一个关键区别是:逻辑模型允许表之间存在M-N关系,规范化技术模型将有一个链接表,该链接表与两个原始表具有N-1关系)

业务模型的OO特性不会直接映射到规范化的表和列设计。ORM(对象-关系-映射)库通常用于将类的属性映射到关系数据库中的表和列

由于业务模型使用数据存储,因此使用数据模型,并且它们一起构成了MVC实现中的模型,因此它们之间的区别常常变得模糊。我认为在你的脑海中清楚地记住他们各自的角色是非常值得的。它有助于决定逻辑应该走到哪里

例如,与rsenna的回答相反,我认为更改单个员工的工资仍然是业务模型的一个功能,即使将其更改为文字值,因为业务模型可能定义