Vấn đề
Lưu ý: Tôi đề cập đến các trình tự toán học , không phải cơ chế trình tự của PostgreSQL .
Tôi có một bảng biểu diễn các chuỗi số nguyên. Định nghĩa là:
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)
);
Mục tiêu của tôi là tìm các hàng bằng cách sử dụng một chuỗi con cho trước. Điều đó có nghĩa là, các hàng trong đó sequence
trường là một chuỗi chứa chuỗi con đã cho (trong trường hợp của tôi, chuỗi được sắp xếp).
Thí dụ
Giả sử bảng chứa dữ liệu sau:
+----+-------+------------+-------------------------------+
| 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} |
+----+-------+------------+-------------------------------+
Vì vậy, nếu thứ tự đã cho là {12, 742, 225, 547}
, tôi muốn tìm hàng 2.
Tương tự, nếu thứ tự đã cho là {3, 17, 25, 377}
, tôi muốn tìm hàng 1 và hàng 4.
Cuối cùng, nếu thứ tự đã cho là {12, 4, 3, 25, 377}
, thì không có hàng nào được trả về.
Điều tra
Đầu tiên, tôi không hoàn toàn chắc chắn rằng đại diện cho chuỗi với một kiểu dữ liệu mảng là khôn ngoan. Mặc dù điều này có vẻ phù hợp với tình hình; Tôi sợ nó làm cho xử lý phức tạp hơn. Có lẽ tốt hơn là biểu diễn các chuỗi khác nhau, sử dụng mô hình quan hệ với một bảng khác.
Theo cách tương tự, tôi nghĩ về việc mở rộng các chuỗi bằng cách sử dụng unnest
hàm mảng và sau đó thêm tiêu chí tìm kiếm của tôi. Tuy nhiên, số lượng thuật ngữ trong chuỗi là biến tôi không thấy làm thế nào để làm điều đó.
Tôi biết cũng có thể cắt chuỗi của mình sau đó bằng cách sử dụng subarray
chức năng của mô-đun intarray nhưng tôi không thấy nó mang lại lợi ích gì cho tìm kiếm của tôi.
Những ràng buộc
Ngay cả khi tại thời điểm mô hình của tôi vẫn đang được phát triển, bảng dự định sẽ bao gồm nhiều chuỗi, từ 50.000 đến 300.000 hàng. Vì vậy, tôi có một hạn chế hiệu suất mạnh mẽ.
Trong ví dụ của tôi, tôi đã sử dụng các số nguyên tương đối nhỏ. Trong thực tế, có thể các số nguyên này trở nên lớn hơn nhiều, lên đến mức tràn bigint
. Trong tình huống như vậy, tôi nghĩ tốt nhất là lưu trữ các số dưới dạng chuỗi (vì không cần thiết phải thực hiện các chuỗi hoạt động toán học này). Tuy nhiên, lựa chọn giải pháp này, điều này khiến cho không thể sử dụng mô-đun intarray , được đề cập ở trên.
numeric
và không phải là một chuỗi ( text
ví dụ)? Tôi không cần phải thực hiện các phép toán trên chuỗi của mình.
text
và ngăn bạn lưu trữ dữ liệu không phải là số. Tùy thuộc, nếu bạn chỉ thực hiện I / O, bạn có thể muốn văn bản giảm xử lý I / O.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
sẽ trả về true, bởi vì lệnh này không được xem xét bởi toán tử này.
bigint
bạn nên sử dụngnumeric
làm loại để lưu trữ chúng. Nó chậm hơn rất nhiều và chiếm nhiều phòng hơn.