Dengan tidak adanya jawaban, saya sendiri sudah mengeksplorasi masalah ini.
Sepertinya fungsi yang ditentukan pengguna dapat menangani semua jenis basis, termasuk bytea
dan smallint[]
, jadi ini tidak banyak mempengaruhi pilihan representasi.
Saya mencoba beberapa representasi berbeda pada server PostgreSQL 9.4 yang berjalan secara lokal pada laptop Windows 7 dengan konfigurasi vanilla. Relasi untuk menyimpan data sinyal aktual adalah sebagai berikut.
Objek Besar untuk seluruh file
CREATE TABLE BlobFile (
eeg_id INTEGER PRIMARY KEY,
eeg_oid OID NOT NULL
);
Array KECIL per saluran
CREATE TABLE EpochChannelArray (
eeg_id INT NOT NULL,
epoch INT NOT NULL,
channel INT,
signal SMALLINT[] NOT NULL,
PRIMARY KEY (eeg_id, epoch, channel)
);
BYTEA per saluran di setiap zaman
CREATE TABLE EpochChannelBytea (
eeg_id INT NOT NULL,
epoch INT NOT NULL,
channel INT,
signal BYTEA NOT NULL,
PRIMARY KEY (eeg_id, epoch, channel)
);
Susunan 2D KECIL per zaman
CREATE TABLE EpochArray (
eeg_id INT NOT NULL,
epoch INT NOT NULL,
signals SMALLINT[][] NOT NULL,
PRIMARY KEY (eeg_id, epoch)
);
Array BYTEA per zaman
CREATE TABLE EpochBytea (
eeg_id INT NOT NULL,
epoch INT NOT NULL,
signals BYTEA NOT NULL,
PRIMARY KEY (eeg_id, epoch)
);
Saya kemudian mengimpor pilihan file EDF ke masing-masing hubungan ini melalui Java JDBC dan membandingkan pertumbuhan dalam ukuran database setelah setiap unggahan.
File-file itu adalah:
- File A: 2706 zaman dari 16 saluran, masing-masing saluran 1024 sampel (16385 sampel per zaman), 85 MB
- File B: 11897 zaman dari 18 saluran, masing-masing saluran 1024 sampel (18432 sampel per zaman), 418 MB
- File C: 11746 zaman dari 20 saluran, masing-masing saluran 64 hingga 1024 sampel (17088 sampel per zaman), 382 MB
Dalam hal biaya penyimpanan, inilah ukuran yang digunakan dalam MB untuk setiap kasus:
Relatif dengan ukuran file asli, Objek Besar sekitar 30-35% lebih besar. Sebaliknya, menyimpan setiap zaman sebagai BYTEA atau SMALLINT [] [] kurang dari 10% lebih besar. Menyimpan setiap saluran sebagai tuple terpisah memberikan peningkatan 40%, baik sebagai BYTEA atau SMALLINT [], jadi tidak jauh lebih buruk daripada menyimpan sebagai objek besar.
Satu hal yang saya awalnya tidak menghargai adalah bahwa "array Multidimensi harus memiliki luasan yang cocok untuk setiap dimensi" di PostgreSQL . Ini berarti bahwa SMALLINT[][]
representasi hanya berfungsi ketika semua saluran dalam zaman memiliki jumlah sampel yang sama. Karenanya File C gagal bekerja dengan EpochArray
relasi.
Dalam hal biaya akses, saya belum bermain-main dengan ini, tetapi setidaknya dalam hal memasukkan data pada awalnya representasi tercepat adalah EpochBytea
dan BlobFile
, dengan EpochChannelArray
yang paling lambat, memakan waktu sekitar 3 kali lebih lama dari dua yang pertama.