2009-10-02 13 views
15

Czy ktoś może wyjaśnić, jak definiować indeksy wielu kolumn w Grails? Dokumentacja jest w najlepszym wypadku skąpa.Grails multi column indexes

to na przykład, nie wydają się działać na wszystkich: http://grails.org/GORM+Index+definitions

miałem trochę szczęścia, ale wyniki wydaje się losowo w najlepsze. Definicje, które działają w jednej klasie domeny, nie są stosowane do innych (oczywiście z różnymi nazwami). http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

Niektóre przykłady pracy i wyjaśnienia byłyby wysoko cenione!

Odpowiedz

17

Rozwiązanie który pracował dla mnie dla indeksów wielu kolumn to:

class ClassName { 
    String name 
    String description 
    String state 

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

To tworzy indeks o nazwie „name_idx” z trzech kolumn w indeksie.

Wadą: kolumny są wymienione w indeksie w kolejności alfabetycznej, a nie w kolejności, w jakiej zostały wprowadzone.

3

Zamknięcie AFAIK, index nigdy nie zostało zaimplementowane, więc te przykłady powinny zostać zignorowane (ta strona służy do omawiania możliwych implementacji, a nie dokumentowania rzeczywistej implementacji).

Prawidłowy sposób zdefiniować indeks jednokolumnową name_idx dla nieruchomości name jest

static mapping = { 
     name index:'name_idx' 
} 

Niestety, ale nie wiem jak zdefiniować indeksu wielu kolumn, spróbuj Grails mailing list jeśli don Tu znajdziesz odpowiedź. W mało prawdopodobnym przypadku, gdy indeksy wielokolumnowe nie mogą być zadeklarowane bezpośrednio w klasach domen, można je zdefiniować w pliku SQL, który je utworzy, jeśli jeszcze nie istnieją (lub spadnie i ponownie je utworzy). Ten plik SQL mogą być wykonywane przez zamknięcie init w Bootstrap.groovy

5

Aby dokonać Indeks Multi-kolumny listy kolumny z separatorem przecinkami (uwaga, nie ma miejsca po przecinku, aby uniknąć this bug. Drugi adres URL, który wskazywał na uderzenia bug, jak mówi:

index:'Name_Idx, Address_Index' 

z przestrzeni; powinien działać jako

index:'Name_Idx,Address_Index' 

pierwszy URL kliknięciu polecenia był proponowanej zmiany (nie wierzę, to jest realizowane obecnie i mają bez ide jak prawdopodobne jest, że kiedykolwiek tak będzie).

+0

Próbowałem tego (z referencji) z różnym szczęściem. Wydaje się działać całkiem losowo. Rzeczy, które działają dla jednej tabeli, dają kolejny wynik w innej tabeli. Co to jest konwencja z nazwami indeksu? Czy "Address_Index" musi być zdefiniowany dla innej kolumny - czy też Grails magicznie dowiaduje się, że musi to być indeks dla pola "adres"? – Kimble

+0

@Kimble, nie sądzę, że jest jakaś magia w nazewnictwie (choć wprawdzie dokumenty i implementacja są na tyle mylące, że nie mogę być tego pewien). –

3

Potrzebowałem mieć możliwość kontrolowania kolejności kolumn w moim indeksie wielu kolumn, a także uczynić go unikalnym. Pracowałem nad ograniczeniami GORM/Hibernate, tworząc indeks w Bootstrap za pomocą bezpośredniego SQL:

+4

To prawdopodobnie lepiej pasuje do wtyczki [DB Migration] (http://grails.org/plugin/database-migration), a nie do bootstrapu. – cdeszaq