2009-10-02 1 views
15

誰かがGrailsでマルチカラムインデックスを定義する方法を説明できますか?ドキュメントは、まれにしかありません。例えばGrailsマルチカラムインデックス

これはまったく機能していないようです: http://grails.org/GORM+Index+definitions

私はこれでいくつかの運を持っていたが、結果は最高の状態でランダムなようです。あるドメインクラスで動作する定義は、別のドメインクラスに適用された場合(コースの名前が異なる)は適用されません。 http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

一部の実例と説明が高く評価されます。

答えて

17

マルチカラム・インデックスのために私のために働いたソリューションは、次のとおりです。

class ClassName { 
    String name 
    String description 
    String state 

    static mapping = { 
     name index: 'name_idx' 
     description index: 'name_idx' 
     state index: 'name_idx' 
    } 
} 

これは、インデックス内の3つの列を持つ「name_idx」と呼ばれるインデックスを作成します。

不利な点:列は、入力された順序ではなく、アルファベット順にインデックスに表示されます。

3

AFAIK、index閉鎖図hereは実装されていないため、これらの例は無視する必要があります(このページは、実際の実装を文書化するのではなく、実装の可能性について議論するためのものです)。

nameプロパティに対して単一列インデックスname_idxを定義するための正しい方法は

static mapping = { 
     name index:'name_idx' 
} 

申し訳ありませんが、私はあなたドン場合Grails mailing listを試してみてください、マルチカラムインデックスを定義する方法がわかりませんここで答えを得られない。万一、複数の列のインデックスをドメインクラスで直接宣言できない場合、それらが存在しない場合(または削除して再作成する場合)、それらを作成するSQLファイルで定義することができます。このSQLファイルには、インデックスが複数列、this bugを避けるために、コンマの後にカンマ区切り(ノート、スペースなしで列をリストにするためにBootstrap.groovy

5

init閉鎖によって実行することができます。あなたがヒットを指す2番目のURLバグは、それが言うように:スペースで

index:'Name_Idx, Address_Index' 

;それは

index:'Name_Idx,Address_Index' 

として、あなたがた提案された変更を指す最初のURLを動作するはずです(私はそれが現在実装されています信じていませんアイデアなしどのようになる可能性が高いか)。

+0

私は様々な運で(参照から)ことを試みました。それは全く無作為に動作するようです。 1つのテーブルで動作するものは、別のテーブルで別の結果をもたらします。 インデックス名の表記法とは何ですか? "Address_Index"は別のカラムに定義する必要がありますか?それとも、Grailsは "address"フィールドのインデックスでなければならないことを魔法のように見つけますか? – Kimble

+0

@Kimble、私は名前付けに魔法がないと思っています(確かに、_and_実装は私が確信できないくらい混乱していますが)。 –

3

マルチカラムインデックスのカラムの順序を制御できるようにする必要がありました。私はGORMの周りに働い/直接SQLを使用してブートストラップにインデックスを作成することで制限を休止:

class BootStrap { 

    DataSource dataSource 

    def init = { servletContext -> 
     if (!MyModel.count()) { // new database 
      createIndexes() 
      ... 
     } 
    } 

    private void createIndexes() { 
     Sql sql = new Sql(dataSource) 
     sql.execute("create unique index my_index on my_model(col1,col2);") 
    } 
+4

これはおそらく、ブートストラップではなく、[DB Migration](http://grails.org/plugin/database-migration)プラグインに適しています。 – cdeszaq

関連する問題