PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да създадете индекс на LOWER(users.username) в Rails (с помощта на postgres)

Да, тази проверка ще изпълни такъв вид заявка и този вид заявка ще направи сканиране на таблица.

Тук всъщност имате няколко проблема:

  • Валидирането подлежи на условия на състезание, тъй като логиката не е в базата данни, където й е мястото. Базата данни трябва да отговаря за всички проблеми с целостта на данните, независимо от обичайната идеология на Rails.
  • Вашето потвърждаване задейства сканиране на таблици и никой не харесва сканиране на таблици.

Можете да решите и двата проблема с един индекс. Първият проблем се решава чрез използване на уникален индекс в базата данни. Вторият проблем се решава чрез индексиране на резултата от lower(username) вместо username .

AFAIK Rails все още не разбира индексите на изрази, така че ще трябва да направите две неща:

  1. Превключете от schema.rb към structure.sql за да предпазите Rails от забравяне за вашия индекс. Във вашия config/application.rb ще искате да зададете:

    config.active_record.schema_format = :sql
    

    Ще трябва също да започнете да използвате db:structure:* рейк задачи вместо db:schema:* задачи. След като преминете към structure.sql , можете да изтриете db/schema.rb тъй като няма да се актуализира или използва повече; също ще искате да започнете да проследявате db/structure.sql в контрола на ревизиите.

  2. Създайте индекса на ръка, като напишете малко SQL в миграция. Това е лесно:

    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
    

Разбира се, това ще ви остави със специфични за PostgreSQL неща, но това не е причина за безпокойство, тъй като ActiveRecord така или иначе не ви дава полезна преносимост.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlalchemy не се изпълнява Коментар на схемата

  2. Разработване на администраторска роля:PG::Грешка:ГРЕШКА:администратори на връзка вече съществува

  3. Схема на релационна база данни за източник на събития

  4. Шаблон за конфигурацията на PostgreSQL

  5. Кой е най-добрият начин за зареждане на огромно количество данни в PostgreSQL?