문제
참고 : 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
배열 함수를 사용하여 시퀀스를 확장 한 다음 검색 기준을 추가 하는 방법에 대해 생각 합니다. 그럼에도 불구하고 시퀀스의 용어 수는 가변적이지만 어떻게 해야하는지 알 수 없습니다.
intarray 모듈 의 subarray
기능을 사용하여 하위 시퀀스에서 시퀀스를 잘라내는 것이 가능하다는 것을 알고 있지만 검색에 어떤 이점이 있는지 알 수 없습니다.
제약
현재 모델이 아직 개발 중이더라도 테이블은 50,000 행에서 300,000 행 사이의 많은 시퀀스로 구성됩니다. 따라서 강력한 성능 제약이 있습니다.
내 예에서는 비교적 작은 정수를 사용했습니다. 실제로, 이러한 정수는 오버플로까지 훨씬 커질 수 bigint
있습니다. 이러한 상황에서 숫자를 문자열로 저장하는 것이 가장 좋습니다 (이러한 일련의 수학 연산을 수행 할 필요가 없기 때문에). 그러나이 솔루션을 선택하면 위에서 언급 한 인타 레이 모듈 을 사용할 수 없습니다 .
numeric
문자열이 아닌 문자열을 사용 text
합니까? 시퀀스에서 수학 연산을 수행 할 필요가 없습니다.
text
가짜 숫자가 아닌 데이터를 저장하지 못합니다. I / O 만 수행하는 경우 I / O 처리를 줄이기 위해 텍스트를 원할 수 있습니다.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
이 연산자는 주문을 고려하지 않기 때문에 true를 반환합니다.
bigint
사용해야numeric
합니다. 훨씬 느리고 공간이 더 많이 걸립니다.