PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara membuat indeks di LOWER(users.username) di Rails (menggunakan postgres)

Ya, validasi itu akan melakukan kueri semacam itu dan kueri semacam itu akan melakukan pemindaian tabel.

Anda sebenarnya memiliki beberapa masalah di sini:

  • Validasi tunduk pada kondisi balapan karena logikanya tidak ada di database tempatnya berada. Basis data harus bertanggung jawab atas semua masalah integritas data terlepas dari ideologi Rails yang biasa.
  • Validasi Anda memicu pemindaian tabel dan tidak ada yang menyukai pemindaian tabel.

Anda dapat menyelesaikan kedua masalah tersebut dengan satu file index. Masalah pertama diselesaikan dengan menggunakan indeks unik di dalam database. Masalah kedua diselesaikan dengan mengindeks hasil lower(username) daripada username .

AFAIK Rails masih belum memahami indeks pada ekspresi sehingga Anda harus melakukan dua hal:

  1. Beralih dari schema.rb ke structure.sql agar Rails tidak melupakan file index. Di config/application.rb . Anda Anda ingin menyetel:

    config.active_record.schema_format = :sql
    

    Anda juga harus mulai menggunakan db:structure:* menyapu tugas alih-alih db:schema:* tugas. Setelah Anda beralih ke structure.sql , Anda dapat menghapus db/schema.rb karena tidak akan diperbarui atau digunakan lagi; Anda juga ingin mulai melacak db/structure.sql dalam kontrol revisi.

  2. Buat indeks dengan tangan dengan menulis sedikit SQL dalam migrasi. Ini mudah:

    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
    

Tentu saja ini akan meninggalkan Anda dengan hal-hal khusus PostgreSQL, tetapi itu tidak perlu dikhawatirkan karena ActiveRecord tidak memberi Anda portabilitas yang berguna.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql - memilih pengamatan dan memasukkan tabel baru

  2. Postgres, table1 kiri bergabung dengan table2 dengan hanya 1 baris per ID di table1

  3. Menerapkan Postgres Sql di Apache Airflow

  4. Cara mendapatkan hasil postgresql_query dari Ansible

  5. Pilih setiap bulan antara tanggal mulai dan akhir