sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan opretter du indeks på LOWER(users.username) i Rails (ved hjælp af postgres)

Ja, den validering ville gøre den slags forespørgsler, og den slags forespørgsler vil lave en tabelscanning.

Du har faktisk et par problemer her:

  • Valideringen er underlagt racebetingelser, fordi logikken ikke er i databasen, hvor den hører hjemme. Databasen bør være ansvarlig for alle dataintegritetsspørgsmål uanset den sædvanlige Rails-ideologi.
  • Din validering udløser tabelscanninger, og ingen kan lide tabelscanninger.

Du kan løse begge disse problemer med ét indeks. Det første problem løses ved at bruge et unikt indeks inde i databasen. Det andet problem løses ved at indeksere resultatet af lower(username) i stedet for username .

AFAIK Rails forstår stadig ikke indekser på udtryk, så du bliver nødt til at gøre to ting:

  1. Skift fra schema.rb til structure.sql for at forhindre Rails i at glemme dit indeks. I din config/application.rb du ønsker at indstille:

    config.active_record.schema_format = :sql
    

    Du skal også begynde at bruge db:structure:* rake-opgaver i stedet for db:schema:* opgaver. Når du har skiftet til structure.sql , kan du slette db/schema.rb da det ikke længere vil blive opdateret eller brugt; du vil også begynde at spore db/structure.sql i revisionskontrol.

  2. Opret indekset i hånden ved at skrive lidt SQL i en migrering. Dette er nemt:

    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
    

Dette vil selvfølgelig efterlade dig med PostgreSQL-specifikke ting, men det er ikke noget at bekymre sig om, da ActiveRecord alligevel ikke giver dig nogen brugbar portabilitet.




  1. mysql_escape_string hele post array?

  2. Er der nogen klasse i MySql, der ligner BulkCopy Class i SQL Server 2005

  3. Påkrævet for at deltage i 2 borde med deres FK'er i et 3. bord

  4. Oracle TO_DATE virker ikke