sql >> Databáze >  >> RDS >> PostgreSQL

Problém s týdenním přidělováním hodin v Rails a Postgresql

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ů.




  1. MySQL Visual Studio Nelze vytvořit okno návrhu pro vybraný objekt

  2. Kvůli chybě syntaxe se v DB nevytváří tabulka

  3. Načte poslední vloženou proceduru uloženou ve formuláři ID v MySQL

  4. MySQL COUNT() více sloupců