database - 您能否以关系数据库可以理解的方式表示应用程序对象?

标签 database orm object

Bill Karwin 有一篇名为“Why Should You Use An ORM ?”的博客文章Reddit 上正在讨论这个问题,我对以下几点感到困惑。

他在评论部分说:

OODBMS and ORM works only on objects that we've instantiated in the application layer. I.e. there's no way to do a query like this:

UPDATE Bugs SET status = 'CLOSED' WHERE status = 'OPEN';

To do this in an ORM or an OODBMS, you'd have to fetch all bugs that match the criteria and instantiate objects for them. Then you could set the attribute and save the objects back to the database one by one. This is expensive and certainly requires more code than the equivalent SQL operation shown above.

This illustrates an advantage of a language like SQL that treats sets as a first-class data type. The OO paradigm cannot substitute for the relational paradigm in all cases. There are some ordinary operations that SQL can do much better.

我用粗体显示了他说当你使用 ORM 时必须为这些错误实例化对象的部分,因为这是我感到困惑的部分。

我的问题是你为什么必须这样做?好吧,面向对象是一回事,关系是另一回事。 但是它们真的如此不同,以至于没有办法表示一个对象以便关系数据库可以理解它吗?例如,我在想你如何可以序列化一个对象,然后将其写入文件可存储的格式。难道不能使用这样的格式将对象传输到关系数据库吗?

最佳答案

is [there] no way to represent an object so that it can be understood by the relational database?

你没有捕获我发言的重点。我并不是说不能在关系数据库中存储对象。我的意思是,面向对象范式假设您在应用程序空间中有一个该对象的实例。也就是说,您可以调用方法并访问对象的属性:

$bug->status = 'CLOSED';
$bug->save();

但在我见过的任何 ORM 中*,如果不先从数据库中获取对象实例,就无法对其进行操作。您也不能像使用 SQL 那样一次操作整组行。

看到一个 ORM 包将对象类型映射到数据集会很有趣。然后,当您更改属性时,它会应用于该集中的所有行。我还没有看到任何 ORM 尝试这样做。

由于并发问题,这将非常具有挑战性。该集合是否包含实例化对象、执行更改或保存更改时该集合中的行?如果它支持所有这些排列作为选项,那么它的使用就会变得如此复杂,以至于人们可能会正确地认为它比直接使用 SQL 没有实际的改进。

回复您的评论:这并不是说集合和对象不兼容。集合可以是一个对象(Java 甚至有 Collection 和 Set 类)。但面向对象范式假设操作适用于一个对象实例,而关系运算符始终适用于集合(一组一行仍然是一个集合)。实际上,当今存在的 ORM 包做出了相同的假设,即一次只能更改一行的一个实例,并且您必须先获取该行才能更改它。

从理论上讲,它可能会扩展 ORM 的功能以在集合上工作 - 但据我所知,没有人尝试这样做。我的观点是,如果一个 ORM 能够完成关系运算符能做的所有事情,那么使用起来会比 SQL 糟糕得多。

* 我排除了类似 SQL 的伪语言,例如 HQL,它们恰好是 ORM 包的一部分(对于 HQL 来说是 Hibernate),但该伪语言本身并不符合 ORM 的资格。

关于database - 您能否以关系数据库可以理解的方式表示应用程序对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337802/

相关文章:

orm - 使用 dot net 3.5 的 dapper dot net 的 CRUD

javascript - 解构任意对象属性

javascript选择更改的对象键

mysql - 这样安全吗?这在 MYSQL 中可以吗?

mysql - 数据库设计 : simplifying many to many

java - Hibernate 中同一个表中的一对多映射

java - 是否可以通过Java的ObjectOutputStream以字符串格式附加多个对象?

mysql主键,是哈希索引还是b树?

mysql - 为了更快的查询应该创建多少索引

node.js - Sequelize : findAll and count associations at the same time