gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:07 25 4
gpt4 key购买 nike

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?

您没有理解我的发言要点。我并不是说不能在关系数据库中存储对象。我的意思是 OO 范式假定您在应用程序空间 中有该对象的一个​​实例。也就是说,您可以调用对象的方法和访问属性:

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

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

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

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

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

理论上可以扩展 ORM 的功能以在集合上工作——但据我所知,还没有人尝试过这样做。我的主张是,可以完成关系运算符可以完成的所有操作的 ORM 比 SQL 更难使用。

* 我排除了类似 SQL 的伪语言,如 HQL,它恰好是 ORM 包的一部分(HQL 是 Hibernate),但该伪语言本身不符合 ORM 的条件。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com