Problema
Nota: mi riferisco alle sequenze matematiche , non al meccanismo delle sequenze di PostgreSQL .
Ho una tabella che rappresenta sequenze di numeri interi. La definizione è:
CREATE TABLE sequences
(
id serial NOT NULL,
title character varying(255) NOT NULL,
date date NOT NULL,
sequence integer[] NOT NULL,
CONSTRAINT "PRIM_KEY_SEQUENCES" PRIMARY KEY (id)
);
Il mio obiettivo è trovare le righe usando una data sottosequenza. Vale a dire, le righe in cui il sequence
campo è una sequenza che contiene la sottosequenza data (nel mio caso, la sequenza è ordinata).
Esempio
Supponiamo che la tabella contenga i seguenti dati:
+----+-------+------------+-------------------------------+
| id | title | date | sequence |
+----+-------+------------+-------------------------------+
| 1 | BG703 | 2004-12-24 | {1,3,17,25,377,424,242,1234} |
| 2 | BG256 | 2005-05-11 | {5,7,12,742,225,547,2142,223} |
| 3 | BD404 | 2004-10-13 | {3,4,12,5698,526} |
| 4 | BK956 | 2004-08-17 | {12,4,3,17,25,377,456,25} |
+----+-------+------------+-------------------------------+
Quindi, se la sottosequenza data è {12, 742, 225, 547}
, voglio trovare la riga 2.
Allo stesso modo, se la sottosequenza data è {3, 17, 25, 377}
, voglio trovare la riga 1 e la riga 4.
Infine, se la sottosequenza data è {12, 4, 3, 25, 377}
, allora non ci sono righe restituite.
indagini
Innanzitutto, non sono del tutto sicuro che rappresentare sequenze con un tipo di dati array sia saggio. Anche se questo sembra appropriato alla situazione; Temo che renda la gestione più complicata. Forse è meglio rappresentare le sequenze in modo diverso, usando un modello di relazioni con un'altra tabella.
Allo stesso modo, penso di espandere le sequenze usando la unnest
funzione array e quindi aggiungere i miei criteri di ricerca. Tuttavia, il numero di termini nella sequenza essendo variabile non vedo come farlo.
So che è anche possibile tagliare la mia sequenza in sottosequenza usando la subarray
funzione del modulo intarray ma non vedo come mi avvantaggia la mia ricerca.
vincoli
Anche se al momento il mio modello è ancora in fase di sviluppo, la tabella dovrebbe essere composta da molte sequenze, tra 50.000 e 300.000 righe. Quindi ho un forte vincolo di prestazioni.
Nel mio esempio ho usato numeri interi relativamente piccoli. In pratica, è possibile che questi numeri interi diventino molto più grandi, fino a traboccare bigint
. In una situazione del genere, penso che il migliore sia memorizzare numeri come stringhe (poiché non è necessario eseguire queste sequenze di operazioni matematiche). Tuttavia, optando per questa soluzione, ciò rende impossibile utilizzare il modulo intarray , menzionato sopra.
numeric
e non una stringa ( text
ad esempio)? Non ho bisogno di eseguire operazioni matematiche sulle mie sequenze.
text
, e ti impedisce di archiviare dati non numerici fasulli. Dipende, se stai solo eseguendo l'I / O, potresti volere del testo per ridurre l'elaborazione dell'I / O.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
restituirà vero, perché l'ordine non è considerato da questo operatore.
bigint
è necessario utilizzarenumeric
come tipo per memorizzarli. È molto più lento e richiede comunque più spazio.