database - 使用类和数据库进行编程

标签 database oop

<分区>

哲学问题在这里 当涉及到 OOP 和数据库时,特别是那些用数据库备份类的程序,解决这个问题的最佳方法是什么?例如,一个团队类可能有一组球员。该程序只会在启动时从数据库中加载所有团队数据,在内存中进行所有操作,然后在关闭时写入数据库。还是在发生变化时将每个数据操作写入数据库更好?如果这是更好的方法,为什么首先将数据加载到内存中?

另一个问题是,在我看来,数据库以一种重要的方式打破了标准的 OOP。对于我的带有玩家集合的团队类,使用 OOP,玩家类不需要拥有一个属性来保存团队名称。玩家将从其所属的团队类别中获取团队名称。现在,要将球员保存在数据库中,每个球员记录都必须有一列用于球队名称(或球队 ID,但这是一回事)。

换句话说,如果你需要一个 GetAllPlayers() 方法,你会把它作为团队类中的成员方法,从内存中返回集合中的所有玩家,还是在玩家类中创建一个静态方法来从数据库中获取所有玩家?

有人知道如何回答这些问题吗?

我已经有一段时间没上过编程课了。任何人都知道一本很好的教科书可以理解这里的最佳方法吗?

最佳答案

数据库以更基本的方式打破了面向对象。 (或者对象打破了关系模型。这取决于你是中层 OO 人还是 DBA。)

关系数据库是根据定义设置的,本质上是声明性的。面向对象的语言是基于对象实例的。由于“对象关系阻抗不匹配”,使两者一起工作很困难。这就是为什么你看到这么多 ORM 解决方案(例如 TopLink、Hibernate 等)的原因。所有这些解决方案都试图让面向对象的程序员认为他们只需要处理对象而不用担心关系数据库。

无论您如何实现它,我认为持久性应该与模型对象分开。我通常将关系代码放在基于接口(interface)的数据访问层中。这样模型对象就不必知道它们是否被持久化,并且我将 CRUD 操作隔离在一个包中。

至于推荐阅读,我会提供 Fowler 的 Patterns of Enterprise Application Architecture供您考虑。

关于database - 使用类和数据库进行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666221/

相关文章:

database - 选择带有允许过滤的低基数列会抛出错误 : No secondary indexes on the restricted columns support the provided operators

r - 将数据转换为整数/nu 会更改数据

database - 如何在数据库设计中表示一对一关系?

java - 使用静态成员和方法的单例?

java - 调用没有对象或传递值的函数

c# - 具体 C# 类中是否需要可序列化属性?

mysql - 什么是内联查询?任何人都可以用简洁明了的例子来定义吗?

java - 有使用 H2 数据库的实际经验吗?

java - 将类型推广到 Java 中的类型系统

java - 循环依赖——总是错的?