Problema
Nota: Me refiero a las secuencias matemáticas , no al mecanismo de secuencias de PostgreSQL .
Tengo una tabla que representa secuencias de enteros. La definición es:
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)
);
Mi objetivo es encontrar filas usando una subsecuencia dada. Es decir, las filas donde el sequence
campo es una secuencia que contiene la subsecuencia dada (en mi caso, la secuencia está ordenada).
Ejemplo
Supongamos que la tabla contiene los siguientes datos:
+----+-------+------------+-------------------------------+
| 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} |
+----+-------+------------+-------------------------------+
Entonces, si la subsecuencia dada es {12, 742, 225, 547}
, quiero encontrar la fila 2.
Del mismo modo, si la subsecuencia dada es {3, 17, 25, 377}
, quiero encontrar la fila 1 y la fila 4.
Finalmente, si la subsecuencia dada es {12, 4, 3, 25, 377}
, entonces no hay filas devueltas.
Investigaciones
Primero, no estoy completamente seguro de que representar secuencias con un tipo de datos de matriz sea inteligente. Aunque esto parece apropiado para la situación; Me temo que hace que el manejo sea más complicado. Quizás sea mejor representar las secuencias de manera diferente, utilizando un modelo de relaciones con otra tabla.
De la misma manera, pienso en expandir las secuencias usando la unnest
función de matriz y luego agregar mis criterios de búsqueda. Sin embargo, el número de términos en la secuencia es variable. No veo cómo hacerlo.
Sé que también es posible cortar mi secuencia en subsecuencia usando la subarray
función del módulo intarray , pero no veo cómo me beneficia en mi búsqueda.
Restricciones
Incluso si en este momento mi modelo todavía se está desarrollando, la tabla está compuesta de muchas secuencias, entre 50,000 y 300,000 filas. Entonces tengo una fuerte restricción de rendimiento.
En mi ejemplo usé enteros relativamente pequeños. En la práctica, es posible que estos enteros se vuelvan mucho más grandes, hasta desbordarse bigint
. En tal situación, creo que lo mejor es almacenar números como cadenas (ya que no es necesario realizar estas secuencias de operaciones matemáticas). Sin embargo, al optar por esta solución, esto hace que sea imposible usar el módulo intarray , mencionado anteriormente.
numeric
y no una cadena ( text
por ejemplo)? No necesito realizar operaciones matemáticas en mis secuencias.
text
, y evita que almacene datos no numéricos falsos. Depende, si solo está haciendo E / S, es posible que desee que el texto reduzca el procesamiento de E / S.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
devolverá verdadero, porque el orden no es considerado por este operador.
bigint
, debe usarlosnumeric
como tipo para almacenarlos. Sin embargo, es mucho más lento y ocupa mucho más espacio.