Pravděpodobně bych zvolil daterange sloupec.
To vám dává flexibilitu mít různě velké kusy a umožňuje vám definovat omezení vyloučení abyste zabránili překrývajícím se rozsahům.
Najít řádek pro daný týden je stále poměrně jednoduché pomocí operátoru "obsahuje" @>
, např. where the_column @> to_date('2019-24', 'iyyy-iw')
najde řádky, které obsahují týden číslo 24 v roce 2019.
Výraz to_date('2019-24', 'iyyy-iw')
vrátí první den (pondělí) zadaného týdne.
Lze také vyhledat všechny řádky, které jsou mezi dvěma týdny, ale konstrukce odpovídajícího období vypadá trochu ošklivě. Můžete buď sestavit zahrnující rozsah s prvním a posledním dnem:daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-24', 'iyyy-iw') + 6, '[]')
Nebo můžete vytvořit rozsah s exkluzivním horním rozsahem s prvním dnem příštího týdne:daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-25', 'iyyy-iw'), '[)')
Zatímco rozsahy lze indexovat poměrně efektivně a , údržba požadovaných indexů GIST je o něco dražší než index B-Stromu ve dvou celých sloupcích.
Další nevýhodou použití rozsahů (pokud opravdu nepotřebujete flexibilitu) je, že zabírají více místa než dva celočíselné sloupce (14 bajtů místo 8 nebo dokonce 4 se dvěma smallinty). Pokud tedy velikost tabulky znepokojuje, pak je vaše současné řešení se sloupci rok/týden efektivnější.
Pokud je vaším vstupem počáteční a koncové datum (spíše než "číslo týdne"), pak bych určitě zvolil daterange
sloupec. Pokud počáteční a koncové datum pokrývá více než jeden týden, uložíte pouze jeden řádek, nikoli více řádků.