【问题标题】:Database in object-oriented design?面向对象设计中的数据库?
【发布时间】:2014-02-19 08:41:58
【问题描述】:

数据库在什么地方适合面向对象的设计?例如,我有一个简单直接的文章数据库,我的用例图有搜索文章、查看文章和创建文章的场景。

我应该有一个与类中的数据库连接的文章类,还是只是一个全局数据库类,以便其他类说用户类可以访问相同的连接?

我还应该使用表作为对象,例如文章是它自己的数据对象,然后有一个像 ArticleApi 这样的类来进行 CRUD 操作吗?

如果有人有任何从头到尾的面向对象的分析和设计教程,那就太好了。

对于这样一个新手问题,我很抱歉,我来自过程编程实践并试图进入软件开发的面向对象部分。

【问题讨论】:

    标签: oop object-oriented-analysis


    【解决方案1】:

    没有唯一的正确答案 - 完全取决于您正在构建的应用程序。对于最简单的应用程序,您可以使用 Transaction Script 方法(这是非常程序化的)。

    然后您可以演变为Table Module - 为数据库中的每个表使用类的方法,该类负责管理表中的所有数据。

    对于更复杂的应用程序,您将拥有Domain Model(通常甚至在您拥有数据库之前)。您将需要Data Mapper 将您的域模型类映射到数据库中的表(您可以将单个类映射到多个表,反之亦然)。借助现代Object Relational Mappers 的强大功能,域模型的使用变得更加容易,因为大部分映射都是自动完成的。 .NET 中的一些工具(例如 Entity Framework)甚至允许您从数据库表生成域模型。

    【讨论】:

      【解决方案2】:

      您没有指定任何特定平台,因此这不是一个非常准确的答案。

      数据库在什么地方适合面向对象的设计?

      我猜我们说的是RDBMS,对吧?好吧,他们没有。这就是为什么我们需要ORM software,比如Hibernate for JavaDoctrine for PHP

      我应该有一个与类中的数据库连接的文章类,还是只是一个全局数据库类,以便其他类说用户类可以访问相同的连接?

      我还应该使用表作为对象,例如文章是它自己的数据对象,然后有一个像 ArticleApi 这样的类来进行 CRUD 操作吗?

      ORM 架构基本上有两种常用的方法:

      • Data Mapper,您的域对象只是普通的旧对象,与 ORM/数据库没有任何依赖关系。您应该以 OO 方式对模型进行建模,然后将其映射到您的数据库中。您有一组单独的对象 (EntityManager) 用于处理实际的持久性。
      • Active Record,您的域对象与 ORM 紧密耦合,它们自己提供一组方法来处理与数据库相关的操作。

      在我个人看来,数据映射器方法优于主动记录,因为它遵循SOLID 原则。但活动记录也可能非常有用。


      您通常应该记住,您的域模型(面向对象)和数据库模型 (rdbms) 是两个不同的东西,必须使用不同的准则进行建模。

      【讨论】:

      • 我现在可以拥抱你,非常有用,是的,我说的是 RDBMS MySQL 是具体的
      • @Crozin 我可以确认一下 - 您是否建议应用程序的数据应单独设计和构建为使用 ERD 数据模型的 RDBMS 数据库,以及使用 ORM 映射到数据库的 OO 设计应用程序?没有别的办法吗?
      • @AJF 是的,如果您正在处理非平凡的系统,这通常比尝试以某种方式合并这两个不同的模型更有益。
      • @Crozin 感谢您的回复。同意非平凡的,如果系统足够简单,可以将类映射到表,那么很好,否则需要另一层操作。那么 LINQ 呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多