Problème
Remarque: je me réfère aux séquences mathématiques , pas au mécanisme des séquences de PostgreSQL .
J'ai un tableau représentant des séquences d'entiers. La définition est:
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)
);
Mon objectif est de trouver des lignes en utilisant une sous-séquence donnée. C'est-à-dire, les lignes où le sequence
champ est une séquence qui contient la sous-séquence donnée (dans mon cas, la séquence est ordonnée).
Exemple
Supposons que le tableau contienne les données suivantes:
+----+-------+------------+-------------------------------+
| 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} |
+----+-------+------------+-------------------------------+
Donc, si la sous-séquence donnée est {12, 742, 225, 547}
, je veux trouver la ligne 2.
De même, si la sous-séquence donnée est {3, 17, 25, 377}
, je veux trouver la ligne 1 et la ligne 4.
Enfin, si la sous-séquence donnée l'est {12, 4, 3, 25, 377}
, aucune ligne n'est renvoyée.
Enquêtes
Premièrement, je ne suis pas complètement certain que représenter des séquences avec un type de données de tableau est sage. Bien que cela semble approprié à la situation; Je crains que cela rend la manipulation plus compliquée. Il vaut peut-être mieux représenter les séquences différemment, en utilisant un modèle de relations avec une autre table.
De la même manière, je pense à étendre les séquences à l'aide de la unnest
fonction tableau puis ajouter mes critères de recherche. Néanmoins, le nombre de termes dans la séquence étant variable, je ne vois pas comment faire cela.
Je sais qu'il est également possible de couper ma séquence en sous-séquence en utilisant la subarray
fonction de module intarray mais je ne vois pas en quoi cela me profite pour ma recherche.
Contraintes
Même si en ce moment mon modèle est encore en développement, la table est destinée à être composée de nombreuses séquences, entre 50 000 et 300 000 lignes. J'ai donc une forte contrainte de performance.
Dans mon exemple, j'ai utilisé des entiers relativement petits. En pratique, il est possible que ces nombres entiers deviennent beaucoup plus grands, jusqu'à déborder bigint
. Dans une telle situation, je pense que le mieux est de stocker les nombres sous forme de chaînes (car il n'est pas nécessaire d'effectuer ces séquences d'opérations mathématiques). Cependant, en optant pour cette solution, cela rend impossible l'utilisation du module intarray , mentionné ci-dessus.
numeric
et non une chaîne ( text
par exemple)? Je n'ai pas besoin d'effectuer d'opérations mathématiques sur mes séquences.
text
, et vous empêche de stocker de fausses données non numériques. Cela dépend, si vous ne faites que des E / S, vous voudrez peut-être que le texte réduise le traitement des E / S.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
retournera true, car la commande n'est pas prise en compte par cet opérateur.
bigint
vous devez les utilisernumeric
comme type pour les stocker. C'est beaucoup plus lent et prend beaucoup plus de place cependant.