gpt4 book ai didi

orm - 为什么 ORM 被认为是好的但 "select *"被认为是坏的?

转载 作者:行者123 更新时间:2023-12-03 07:52:42 25 4
gpt4 key购买 nike

ORM 通常不涉及执行 select * 之类的操作吗?

如果我有一个表 MyThing,其中包含 A、B、C、D 等列,那么通常会有一个对象 MyThing,其属性为 A、B、C、D。

如果该对象没有被如下所示的 select 语句完全实例化,只获取 A、B,而不是 C、D,那将是邪恶的:

select A, B from MyThing/* 不要得到 C 和 D,因为我们不需要它们 */

但总是这样做也是邪恶的:

select A, B, C, D/* 获取所有列,这样我们就可以完全实例化 MyThing 对象 */

ORM 是否假设数据库访问如此之快,现在您不必担心它,因此您总是可以获取所有列?

或者,您是否有不同的 MyThing 对象,一个用于可能碰巧在 select 语句中的每个列组合?

编辑:在回答问题之前,请阅读 Nicholas Piasecki 和 Bill Karwin 的回答。我想我的问题问得不好,因为很多人误解了它,但尼古拉斯 100% 理解它。和他一样,我对其他答案很感兴趣。

编辑#2:与此问题相关的链接:

Why do we need entity objects?

http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx ,尤其是“部分对象问题和加载时间悖论”部分

http://groups.google.com/group/comp.object/browse_thread/thread/853fca22ded31c00/99f41d57f195f48b ?

http://www.martinfowler.com/bliki/AnemicDomainModel.html

http://database-programmer.blogspot.com/2008/06/why-i-do-not-use-orm.html

最佳答案

以我有限的经验,事情正如你所描述的那样——这是一个困惑的情况,通常的逃避“这取决于”的答案适用。

我工作的在线商店就是一个很好的例子。它有一个 Brand对象,并且在网站的主页上,商店销售的所有品牌都列在左侧。要显示这个品牌菜单,网站需要的只是整数BrandId。和字符串 BrandName .但是 Brand对象包含一大堆其他属性,最值得注意的是 Description可以包含大量关于 Brand 的文本的属性.没有两种方法,加载所有关于品牌的额外信息只是为了在无序列表中吐出它的名字是(1)可测量且显着缓慢,通常是因为大文本字段和(2)当它出现时效率很低内存使用,建立大字符串,甚至在扔掉它们之前都没有看它们。

许多 ORM 提供的一个选项是延迟加载属性。所以我们可以有一个 Brand对象返回给我们,但耗时且浪费内存Description直到我们尝试调用它的 get访问者。此时,代理对象将拦截我们的调用并及时从数据库中提取描述。这有时足够好,但已经烧伤了我足够多的时间,我个人不推荐它:

  • 很容易忘记该属性是延迟加载的,只需编写一个 foreach 循环就会引入 SELECT N+1 问题。谁知道当 LINQ 参与其中时会发生什么。
  • 如果由于传输困惑或网络中断而导致即时数据库调用失败怎么办?我几乎可以保证,任何像 string desc = brand.Description 一样无害的代码没想到这么简单的电话就扔了DataAccessException .现在你刚刚以一种令人讨厌和意想不到的方式坠毁。 (是的,我已经看到我的应用程序因此而严重下降。学到了艰难的方法!)

  • 所以我最终做的是,在需要性能或容易出现数据库死锁的场景中,我创建了一个单独的接口(interface),网站或任何其他程序都可以调用该接口(interface)来访问已经查询过的特定数据 block 计划仔细审查。架构最终看起来像这样(原谅 ASCII 艺术):

    网站: Controller 类
    |
    |----------------------------------+
    | |
    应用服务器:IDocumentService IOrderService、IInventoryService 等
    (数组、数据集)(常规 OO 对象,如 Brand)
    | |
    | |
    | |
    数据层:(原始 ADO.NET 返回数组,(像 NHibernate 一样的“全奶油” ORM)
    数据集,简单的类)

    我曾经认为这是作弊,颠覆了OO对象模型。但在实际意义上,只要你做这个显示数据的快捷方式,我认为就可以了。更新/插入以及您仍然通过完全水合、ORM 填充的域模型进行的操作,与显示特定数据子集相比,这种情况发生的频率要低得多(在我的大多数情况下)。像 NHibernate 这样的 ORM 可以让你进行预测,但到那时我还没有看到 ORM 的意义。无论如何,这可能是一个存储过程,编写 ADO.NET 需要两秒钟。

    这只是我的两分钱。我期待着阅读其他一些回复。

    关于orm - 为什么 ORM 被认为是好的但 "select *"被认为是坏的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/291853/

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