【问题标题】:Are Denormalized Updates Possible With NHibernate Without Using a Stored Procedure?NHibernate 是否可以在不使用存储过程的情况下进行非规范化更新?
【发布时间】:2010-10-09 05:10:39
【问题描述】:

我正在考虑在一个项目中使用 NHibernate,该项目的数据库具有某种程度的计划非规范化(由 DBA 计划)。从一组表中读取并将一列映射到一个属性不是问题。但是,在更新时,我必须将一个属性映射回原始表中的原始列,并在非规范化表中更新该列的几个副本。是否可以在不使用存储过程的情况下使用 NHibernate 做到这一点?

编辑:虽然我倾向于同意 NXC 的回答,但这个问题是关于如何解决 NHibernate 的问题,而不是在数据库中解决问题。

【问题讨论】:

    标签: nhibernate nhibernate-mapping denormalization


    【解决方案1】:

    是的,您可以注册一个从 DefaultSaveOrUpdateEventListener 继承的事件侦听器,覆盖 OnSaveOrUpdate 并更新其他实体。

    这里有一些关于事件监听器的博文:

    【讨论】:

      【解决方案2】:

      关于去规范化数据的一些想法:

      • 谨慎使用;众所周知,过度使用非规范化数据是导致维护和数据质量问题的根源。我参与的一个 J2EE 项目在 560 个表中只有 4 个非规范化数据项 - 其中两个是搜索表。

      • 依靠应用程序来保持非规范化数据同步是一种已知的反模式。在事务系统中维护非规范化数据的普遍接受的方法是使用数据库触发器。使用触发器意味着来自任何来源(不仅仅是您的应用程序)的更新将由数据库本身传播。你最好使用触发器来维护非规范化的数据,除非有特定的东西阻止它。

      • 非规范化数据给维护开发人员留下了陷阱(尤其是如果您不使用数据库触发器来维护数据)。确保记录每条非规范化数据。

      【讨论】:

      • 好点。非规范化不应该是应用程序的关注点。然而,我们的 DBA 也认为触发器是一种反模式(我在一定程度上同意)。这有点像“把邪恶放在哪里”的场景。
      • 我同意很少使用非规范化,但第二点不适用于 NHibernate 驱动的应用程序。 DB 触发器通常对 NHibernate 不友好(即它们可能会破坏二级缓存)。另外,这个答案太笼统了......它并没有真正回答这个问题。
      • 它绝对适用于 O/R 映射层,除非您可以保证在整个数据库生命周期中的每个数据库写入都会经过该数据访问层。
      • 尊重您的 DBA,如果他们认为您应该在应用程序代码中维护非规范化数据而不是安装 DB 触发器来执行此操作,我想知道 (a) 他们一直在做什么吸烟和什么(b)他们的经销商的手机号码是什么。
      猜你喜欢
      • 2012-06-02
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多