NHibernate是否可以在不使用存储过程的情况下进行非规范化更新?

NHibernate是否可以在不使用存储过程的情况下进行非规范化更新?,nhibernate,nhibernate-mapping,denormalization,Nhibernate,Nhibernate Mapping,Denormalization,我正在考虑在一个项目中使用NHibernate,该项目有一个具有某种程度的计划去规范化(由DBA计划)的数据库。读取一组表并将一列映射到一个属性不是问题。但是,在更新时,我必须将一个属性映射回原始表中的原始列,并在非规范化表中更新该列的一些副本。是否可以在不使用存储过程的情况下使用NHibernate执行此操作 编辑:虽然我倾向于同意NXC的答案,但这个问题是关于如何解决NHibernate的问题,而不是在数据库中解决它 是的,您可以注册从DefaultSaveOrUpdateEventList

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


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

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

以下是一些关于事件侦听器的博客帖子:


    • 关于非标准化数据的一些想法:

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

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

      • 非规范化数据为维护开发人员留下了陷阱(特别是如果您不使用DB触发器来维护数据)。确保每一个非规范化数据都有文档记录


      好的观点。非规范化不应成为应用程序的关注点。然而,我们的数据库系统认为触发器也是反模式(我同意一定程度)。这有点像一个“把邪恶放在哪里”的场景。我同意很少使用非规范化,但第二点不适用于NHibernate驱动的应用程序。DB触发器通常对NHibernate不友好(即,它们可能会破坏二级缓存)。另外,这个答案太笼统了。。。它并没有真正回答这个问题。它绝对适用于O/R映射层,除非您可以保证在数据库的整个生命周期中的每个数据库写入都将通过该数据访问层。在适当尊重您的DBA的情况下,如果他们认为您应该在应用程序代码中维护非规范化数据,而不是安装DB触发器,我想知道(a)他们一直在吸烟,以及(b)他们经销商的手机号码是什么。