Problem
Hinweis: Ich beziehe mich auf die mathematischen Sequenzen , nicht auf den Sequenzmechanismus von PostgreSQL .
Ich habe eine Tabelle, die Folgen von ganzen Zahlen darstellt. Die Definition lautet:
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)
);
Mein Ziel ist es, Zeilen mit einer bestimmten Teilsequenz zu finden. Das heißt, die Zeilen, in denen das sequence
Feld eine Sequenz ist, die die angegebene Teilsequenz enthält (in meinem Fall ist die Sequenz geordnet).
Beispiel
Angenommen, die Tabelle enthält folgende Daten:
+----+-------+------------+-------------------------------+
| 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} |
+----+-------+------------+-------------------------------+
Wenn also die gegebene Teilsequenz ist {12, 742, 225, 547}
, möchte ich die Zeile 2 finden.
In ähnlicher Weise {3, 17, 25, 377}
möchte ich , wenn die gegebene Teilsequenz ist , die Zeile 1 und die Zeile 4 finden.
Wenn die angegebene Teilsequenz lautet {12, 4, 3, 25, 377}
, werden keine Zeilen zurückgegeben.
Untersuchungen
Erstens bin ich mir nicht ganz sicher, ob es sinnvoll ist, Sequenzen mit einem Array-Datentyp darzustellen. Obwohl dies der Situation angemessen erscheint; Ich fürchte, es macht die Handhabung komplizierter. Vielleicht ist es besser, die Sequenzen anders darzustellen, indem Sie ein Beziehungsmodell mit einer anderen Tabelle verwenden.
Auf die gleiche Weise denke ich darüber nach, die Sequenzen mithilfe der unnest
Array-Funktion zu erweitern und dann meine Suchkriterien hinzuzufügen. Da die Anzahl der Begriffe in der Sequenz jedoch variabel ist, sehe ich nicht, wie das geht.
Ich weiß, dass es auch möglich ist, meine Sequenz mithilfe der subarray
Funktion des Intarray- Moduls in Teilsequenzen zu schneiden, aber ich sehe nicht, wie es mir bei meiner Suche zugute kommt.
Einschränkungen
Auch wenn sich mein Modell derzeit noch in der Entwicklung befindet, soll die Tabelle aus vielen Sequenzen zwischen 50.000 und 300.000 Zeilen bestehen. Ich habe also eine starke Leistungsbeschränkung.
In meinem Beispiel habe ich relativ kleine ganze Zahlen verwendet. In der Praxis ist es möglich, dass diese ganzen Zahlen bis zum Überlauf viel größer werden bigint
. In einer solchen Situation ist es meiner Meinung nach am besten, Zahlen als Zeichenfolgen zu speichern (da diese Sequenzen mathematischer Operationen nicht ausgeführt werden müssen). Wenn Sie sich jedoch für diese Lösung entscheiden, ist es unmöglich, das oben erwähnte Intarray- Modul zu verwenden .
numeric
und nicht eine Zeichenfolge ( text
zum Beispiel)? Ich muss keine mathematischen Operationen an meinen Sequenzen ausführen.
text
ist und Sie daran hindert, falsche nicht numerische Daten zu speichern. Abhängig davon, ob Sie nur E / A ausführen, möchten Sie möglicherweise, dass Text die E / A-Verarbeitung reduziert.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
Gibt true zurück, da die Reihenfolge von diesem Operator nicht berücksichtigt wird.
bigint
, sollten Sie sienumeric
als Typ zum Speichern verwenden. Es ist viel langsamer und nimmt viel mehr Platz ein.