Grails 使用视图或将其持久化到数据库中的计算字段

Grails 使用视图或将其持久化到数据库中的计算字段,grails,gorm,Grails,Gorm,我想知道哪个更好用,数据库视图还是数据库中的持久字段 例如,我正在以下视图中初始化win\u countvw\u stats: ... CASE WHEN game.in_decision = true AND game.user_score > game.opponent_score THEN 1 ELSE 0 END AS win_count, ... 然后将其映射到域类: package com.x class Stat { //fields here.

我想知道哪个更好用,数据库视图还是数据库中的持久字段

例如,我正在以下视图中初始化
win\u count
vw\u stats

...
CASE
    WHEN game.in_decision = true AND game.user_score > game.opponent_score THEN 1
    ELSE 0
END AS win_count,
...
然后将其映射到域类:

package com.x

class Stat {

    //fields here...

    static mapping = {
        table 'vw_stats'
        version false
    }
}
或者,我应该使用此域类在数据库中保留字段
winCount
,并在保存前对其进行操作吗

package com.x

class Game {

    //fields here...
    Short winCount = 0


  static constraints = {
      //constraints here...        
      winCount nullable: false, range: 0..99

  }

  def beforeInsert(){
      this.beforeUpdate()
  }

  def beforeUpdate(){

      //other manipulations here...
      if inDecision and userScore > opponentScore
          winCount = 1
  }
}

我发现视图的问题是,它在运行应用程序时会生成一个表,然后我必须手动删除该表并运行代码来生成视图

更新#1 通过将它们持久化到数据库而不是视图中,可能会节省IO成本

更新#2
忘了提一下,我应该能够在服务的结果字段上应用聚合函数。

第三种方法是使用属性。与视图一样,该值也是动态计算的

package com.x

class Game {

    //fields here...
    Short winCount = 0

  static constraints = {
      //constraints here...        
      winCount nullable: false, range: 0..99

  }

    static mapping = {
        winCount formula: 'CASE WHEN in_decision = true AND user_score > opponent_score THEN 1 ELSE 0 END'
    }

}

第三种方法是使用属性。与视图一样,该值也是动态计算的

package com.x

class Game {

    //fields here...
    Short winCount = 0

  static constraints = {
      //constraints here...        
      winCount nullable: false, range: 0..99

  }

    static mapping = {
        winCount formula: 'CASE WHEN in_decision = true AND user_score > opponent_score THEN 1 ELSE 0 END'
    }

}

没有完全理解您试图实现的确切应用程序,您是否考虑过在实际需要时使用并让域实例计算它?这将避免预先计算甚至可能不被使用的数据。

如果不完全理解您试图实现的确切应用程序,您是否考虑过在实际需要时使用并让域实例计算它?这将避免预先计算甚至可能不被使用的数据。

哦,您应该避免询问有关堆栈溢出的建议。这是不允许的。我能用criteriaQuery在winCount上应用计数(或任何聚合函数)吗?是的。它与任何其他域类属性一样可用。wincount唯一不能工作的时间是在单元测试中。可移植性如何?我想,如果我不使用专有语句/关键字/等,如果机会出现,它应该可以很好地移植到其他数据库系统。哦,你应该避免询问关于堆栈溢出的建议。这是不允许的。我能用criteriaQuery在winCount上应用计数(或任何聚合函数)吗?是的。它与任何其他域类属性一样可用。wincount唯一不能工作的时间是在单元测试中。可移植性如何?我想,如果我不使用专有语句/关键字/等,如果机会出现,它应该可以很好地移植到其他数据库系统。