PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak utworzyć indeks na LOWER(users.username) w Railsach (za pomocą postgresa)

Tak, ta walidacja wykonałaby tego rodzaju zapytanie, a takie zapytanie wykona skanowanie tabeli.

Właściwie masz tutaj kilka problemów:

  • Weryfikacja podlega warunkom wyścigu, ponieważ logika nie znajduje się w bazie danych, do której należy. Baza danych powinna być odpowiedzialna za wszystkie problemy z integralnością danych, niezależnie od zwykłej ideologii Railsów.
  • Twoja walidacja uruchamia skanowanie tabel i nikt nie lubi skanowania tabel.

Możesz rozwiązać oba te problemy za pomocą jednego indeksu. Pierwszy problem rozwiązuje zastosowanie unikalnego indeksu wewnątrz bazy danych. Drugi problem rozwiązuje indeksowanie wyniku lower(username) zamiast username .

AFAIK Rails nadal nie rozumie indeksów wyrażeń, więc będziesz musiał zrobić dwie rzeczy:

  1. Przełącz z schema.rb do structure.sql aby Railsy nie zapomniały o twoim indeksie. W pliku config/application.rb będziesz chciał ustawić:

    config.active_record.schema_format = :sql
    

    Musisz także zacząć używać db:structure:* rake zadania zamiast db:schema:* zadania. Po przejściu na structure.sql , możesz usunąć db/schema.rb ponieważ nie będzie już aktualizowany ani używany; będziesz także chciał rozpocząć śledzenie db/structure.sql w kontroli wersji.

  2. Utwórz indeks ręcznie, pisząc trochę kodu SQL w migracji. To proste:

    def up
      connection.execute(%q{
        create index idx_users_lower_username on users(lower(username))
      })
    end
    
    def down
      connection.execute(%q{
        drop index idx_users_lower_username
      })
    end
    

Oczywiście pozostawi ci to rzeczy specyficzne dla PostgreSQL, ale nie ma się czym martwić, ponieważ ActiveRecord i tak nie zapewnia użytecznej przenośności.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest odpowiednik JDBC polecenia \connect Postgresa?

  2. Różnica między tekstem a varchar (różne znaki)

  3. Jak zwrócić zwykłą wartość z zapytania Knex / Postgresql?

  4. Jak wygenerować wiele szeregów czasowych w jednym zapytaniu sql?

  5. Operator ALL w klauzuli WHERE w Rails