使用视图计算字段或将其持久保存在数据库中

时间:2016-03-25 19:37:54

标签: grails gorm

我想知道哪个更好用,数据库视图或只是在数据库中保留字段。

例如,我在以下视图win_count中初始化vw_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 忘记提及,我应该能够在服务中的结果字段上应用聚合函数。

2 个答案:

答案 0 :(得分:2)

第三种方法是使用derived属性。与视图一样,该值是即时计算的。

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'
    }

}

答案 1 :(得分:0)

没有完全理解您要实现的确切应用程序,您是否考虑过使用transients并让域实例在实际需要时进行计算?这样可以避免预先计算甚至无法使用的数据。