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

Masalah alokasi jam mingguan di Rails dan Postgresql

Saya mungkin akan memilih rentang tanggal kolom.

Itu memberi Anda fleksibilitas untuk memiliki potongan berukuran berbeda dan memungkinkan Anda untuk menentukan batasan pengecualian untuk mencegah rentang yang tumpang tindih.

Menemukan baris untuk minggu tertentu masih cukup sederhana menggunakan operator "berisi" @> , misalnya where the_column @> to_date('2019-24', 'iyyy-iw') menemukan baris yang berisi minggu nomor 24 tahun 2019.

Ekspresi to_date('2019-24', 'iyyy-iw') mengembalikan hari pertama (Senin) dari minggu yang ditentukan.

Menemukan semua baris yang berada di antara dua minggu juga dapat dilakukan, namun konstruksi rentang tanggal yang sesuai terlihat agak jelek. Anda dapat membuat rentang inklusif dengan hari pertama dan terakhir:daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-24', 'iyyy-iw') + 6, '[]')

Atau Anda dapat membuat rentang dengan rentang atas eksklusif dengan hari pertama minggu depan:daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-25', 'iyyy-iw'), '[)')

Meskipun rentang dapat diindeks dengan cukup efisien dan , indeks GIST yang diperlukan sedikit lebih mahal untuk dipelihara daripada indeks B-Tree pada dua kolom bilangan bulat.

Kelemahan lain dari menggunakan rentang (jika Anda tidak benar-benar membutuhkan fleksibilitas) adalah bahwa rentang memakan lebih banyak ruang daripada dua kolom integer (14 byte, bukan 8, atau bahkan 4 dengan dua smallint). Jadi jika ukuran tabel menjadi perhatian, maka solusi Anda saat ini dengan kolom tahun/minggu lebih efisien.

Jika input Anda adalah tanggal mulai dan akhir untuk memulai (bukan "nomor minggu"), maka saya pasti akan menggunakan daterange kolom. Jika tanggal mulai dan tanggal akhir tersebut mencakup lebih dari satu minggu, maka Anda hanya menyimpan satu baris, bukan beberapa baris.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BERBEDA dengan dua array_agg (atau satu array_agg dengan Tuple di dalamnya)?

  2. Konfigurasi Puma Cluster di Heroku

  3. Bagaimana memahami ANALISIS JELASKAN

  4. Menggunakan fungsi jendela dalam pernyataan pembaruan

  5. Tidak dapat PILIH dari klausa UPDATE RETURNING di postgres