Come garantire registrazioni con intervalli di tempo non sovrapponibili?

voti
50

Devo assicurarmi che il mio database contenga solo le voci in cui due o più colonne sono uniche. Questo può essere facilmente ottenuto con un UNIQUEvincolo su quelle colonne.

Nel mio caso, devo vietare la duplicazione solo per i periodi di tempo che si sovrappongono. La tabella ha valid_frome valid_tocolonne. In alcuni casi potrebbe essere necessario prima di tutto scadere la voce attiva a impostando valid_to = now, e poi inserendo una nuova voce regolata a valid_from = nowe valid_to = infinity.

Sembra che io sia in grado di far scadere la voce precedente senza problemi di utilizzoUPDATE, ma l'inserimento della nuova voce sembra essere fastidioso in quanto le mie colonne di base sono attualmenteUNIQUE, e quindi non può essere aggiunto di nuovo

Ho pensato di aggiungere valid_frome valid_tocome parte del UNIQUEvincolo, ma questo renderebbe solo il vincolo più sciolto, e permetterebbe duplicati e intervalli di tempo che si sovrappongono per esistere.

È pubblicato 10/05/2020 alle 19:31
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Siete sulla strada giusta. Ma la sintassi per i vincoli di esclusione è leggermente diversa:

CREATE TABLE registration  (
  tbl_id  integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a   integer NOT NULL
, col_b   integer NOT NULL
, valid_from timestamptz
, valid_to   timestamptz
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tstzrange(valid_from, valid_to) WITH &&)
);

Potrebbe essere necessario installare prima il modulo btree_gistaggiuntivo, a seconda della definizione della tabella non rivelata.

Ogni colonna deve essere elencata con il rispettivo operatore.

E avete bisogno di un tipo di gamma. Supponendo timestamp with time zoneper valid_frome valid_to, l'espressione tstzrange(valid_from, valid_to)lo farebbe.

Correlato:


Forse, un design superiore sarebbe un rapporto uno a molti tra il vostro registrationtavolo e le voci 1-N in un nuovo registration_rangetavolo. E una qualche logica per determinare la voce attualmente valida (per un dato punto nel tempo). Dipende da altre informazioni non divulgate.


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more