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.