sql >> Databáze >  >> RDS >> PostgreSQL

Jak vytvořit index na LOWER (users.username) v Rails (pomocí postgres)

Ano, toto ověření by provedlo tento druh dotazu a tento druh dotazu provede skenování tabulky.

Ve skutečnosti zde máte několik problémů:

  • Ověření podléhá podmínkám závodu, protože logika není v databázi, kam patří. Databáze by měla být zodpovědná za všechny problémy integrity dat bez ohledu na obvyklou ideologii Rails.
  • Vaše ověření spouští prohledávání tabulek a nikdo nemá rád prohledávání tabulek.

Oba tyto problémy můžete vyřešit jedním indexem. První problém je vyřešen použitím jedinečného indexu uvnitř databáze. Druhý problém je vyřešen indexováním výsledku lower(username) spíše než username .

AFAIK Rails stále nerozumí indexům výrazů, takže budete muset udělat dvě věci:

  1. Přepněte z schema.rb na structure.sql aby Rails nezapomněl na váš index. Ve vašem config/application.rb budete chtít nastavit:

    config.active_record.schema_format = :sql
    

    Budete také muset začít používat db:structure:* úlohy rake namísto db:schema:* úkoly. Jakmile přepnete na structure.sql , můžete odstranit db/schema.rb protože již nebude aktualizován ani používán; budete také chtít začít sledovat db/structure.sql v kontrole revizí.

  2. Vytvořte index ručně napsáním části SQL při migraci. Je to snadné:

    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
    

Samozřejmě vám to umožní věci specifické pro PostgreSQL, ale to není důvod k obavám, protože ActiveRecord vám stejně neposkytuje žádnou užitečnou přenositelnost.




  1. R:[unixODBC][Správce ovladačů]Nelze otevřít knihovnu 'SQL Server':soubor nenalezen

  2. Chyba převodu pole na řetězec Symfony 3

  3. Vložte data ze sloupce tabulky a uložte do sloupce jiné tabulky

  4. php sdružování připojení mysql