2016-03-25 9 views
0

どちらを使用するのが良いか、データベースビューか、単にデータベースのフィールドを保持したいのですが。ビューを使用して計算されたフィールドまたはデータベース内に永続化するフィールド

例えば

、私は次のビューvw_statswin_countを初期化しています:

package com.x 

class Stat { 

    //fields here... 

    static mapping = { 
     table 'vw_stats' 
     version false 
    } 
} 

それとも、私がフィールドwinCountを持続する必要があります、ドメインクラスにマッピングされ

... 
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 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

第3の方法は、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

criteriaQueryを使用してwinCountにカウント(または集計関数)を適用できますか? – TekiusFanatikus

+0

はい。他のドメインクラスのプロパティと同様に利用できます。 wincountが動作しない唯一の時間はユニットテストです。 –

0

完全にあなたが達成しようとしている正確なアプリケーションを理解していない、あなたはtransientsを使用して、それが実際に必要とされるとき、ドメインインスタンスは、それを計算させることについて考えていますか?これにより、使用されていない可能性のあるデータの事前計算が回避されます。