Проблема
Примітка. Я маю на увазі математичні послідовності , а не механізм послідовностей PostgreSQL .
У мене є таблиця, що представляє послідовності цілих чисел. Визначення таке:
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)
);
Моя мета - знайти рядки за допомогою заданої послідовності. Тобто, рядки, де sequence
поле - це послідовність, яка містить задану послідовність (у моєму випадку послідовність послідовностей).
Приклад
Припустимо, таблиця містить такі дані:
+----+-------+------------+-------------------------------+
| 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} |
+----+-------+------------+-------------------------------+
Отже, якщо дана підрядність є {12, 742, 225, 547}
, я хочу знайти рядок 2.
Точно так само, якщо дана підрядність є {3, 17, 25, 377}
, я хочу знайти рядок 1 і рядок 4.
Нарешті, якщо дана підрядність є {12, 4, 3, 25, 377}
, то рядки не повертаються.
Розслідування
По-перше, я не зовсім впевнений, що мудрі представляють послідовності з типом даних масиву. Хоча це видається відповідним ситуації; Я боюся, що це ускладнює обробку. Можливо, краще представити послідовності по-різному, використовуючи модель відносин з іншою таблицею.
Таким же чином я думаю про розширення послідовностей за допомогою функції unnest
масиву, а потім додаю свої критерії пошуку. Тим не менш, кількість термінів у послідовності, що змінюється, я не бачу, як це зробити.
Я знаю, що також можна в подальшому скоротити мою послідовність за допомогою subarray
функції модуля intarray, але я не бачу, як це моє користь для мого пошуку.
Обмеження
Навіть якщо на даний момент моя модель ще розробляється, таблиця повинна складатися з безлічі послідовностей, між 50 000 і 300 000 рядків. Тож у мене сильне обмеження в роботі.
У своєму прикладі я використовував відносно невеликі цілі числа. На практиці можливо, ці цілі числа стають набагато більшими, аж до переповнення bigint
. У такій ситуації я думаю, що найкраще - зберігати числа як рядки (оскільки виконувати ці послідовності математичних операцій не потрібно). Однак, вибравши це рішення, це унеможливлює використання модуля intarray , згаданого вище.
numeric
а не рядок ( text
наприклад)? Мені не потрібно виконувати математичні операції над своїми послідовностями.
text
і заважає вам зберігати фальшиві нечислові дані. Залежить, якщо ви робите лише введення-виведення, можливо, ви хочете, щоб текст зменшив обробку вводу-виводу.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
повернеться true, оскільки замовлення не розглядається цим оператором.
bigint
вам слід використовуватиnumeric
як тип для їх зберігання. Це набагато повільніше і забирає місце більше місця.