Masalah
Catatan: Saya merujuk pada urutan matematis , bukan mekanisme urutan PostgreSQL .
Saya punya tabel yang mewakili urutan bilangan bulat. Definisi tersebut adalah:
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)
);
Tujuan saya adalah menemukan baris menggunakan urutan yang diberikan. Dengan kata lain, baris di mana sequence
bidang adalah urutan yang berisi urutan yang diberikan (dalam kasus saya, urutan tersebut dipesan).
Contoh
Misalkan tabel tersebut berisi data berikut:
+----+-------+------------+-------------------------------+
| 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} |
+----+-------+------------+-------------------------------+
Jadi jika yang diberikan berikutnya adalah {12, 742, 225, 547}
, saya ingin mencari baris 2.
Demikian pula, jika urutan yang diberikan adalah {3, 17, 25, 377}
, saya ingin mencari baris 1 dan baris 4.
Akhirnya, jika urutan yang diberikan adalah {12, 4, 3, 25, 377}
, maka tidak ada baris yang dikembalikan.
Investigasi
Pertama, saya tidak sepenuhnya yakin bahwa merepresentasikan urutan dengan tipe data array adalah bijaksana. Meskipun ini sepertinya sesuai dengan situasi; Saya khawatir itu membuat penanganan lebih rumit. Mungkin lebih baik untuk mewakili urutan berbeda, menggunakan model hubungan dengan tabel lain.
Dengan cara yang sama, saya berpikir tentang memperluas urutan menggunakan unnest
fungsi array dan kemudian menambahkan kriteria pencarian saya. Namun demikian, jumlah istilah dalam urutan menjadi variabel I tidak melihat bagaimana melakukan itu.
Saya tahu juga mungkin untuk memotong urutan saya di kemudian hari menggunakan subarray
fungsi modul intarray tapi saya tidak melihat bagaimana itu menguntungkan saya untuk pencarian saya.
Kendala
Bahkan jika saat ini model saya masih dikembangkan, tabel ini dimaksudkan untuk terdiri dari banyak urutan, antara 50.000 dan 300.000 baris. Jadi saya punya kendala kinerja yang kuat.
Dalam contoh saya, saya menggunakan bilangan bulat yang relatif kecil. Dalam praktiknya, dimungkinkan bahwa bilangan bulat ini menjadi jauh lebih besar, hingga meluap bigint
. Dalam situasi seperti itu, saya pikir yang terbaik adalah menyimpan angka sebagai string (karena tidak perlu melakukan urutan operasi matematika ini). Namun, memilih solusi ini, ini membuat tidak mungkin untuk menggunakan modul intarray , yang disebutkan di atas.
numeric
dan bukan string ( text
misalnya)? Saya tidak perlu melakukan operasi matematika pada urutan saya.
text
, dan mencegah Anda menyimpan data non-numerik palsu. Tergantung, jika Anda hanya melakukan I / O, Anda mungkin ingin teks mengurangi pemrosesan I / O.
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
akan mengembalikan true, karena pesanan tidak dipertimbangkan oleh operator ini.
bigint
Anda harus menggunakannumeric
sebagai tipe untuk menyimpannya. Ini jauh lebih lambat dan membutuhkan lebih banyak ruang.