За відсутності відповідей я сам досліджував це питання далі.
Схоже, що визначені користувачем функції можуть обробляти всі базові типи, в тому числі bytea
і smallint[]
, тому це не сильно впливає на вибір представництва.
Я спробував кілька різних представлень на сервері PostgreSQL 9.4, який працює локально на ноутбуці Windows 7 з конфігурацією ванілі. Відносини для зберігання фактичних даних сигналу були такими.
Великий об’єкт для всього файлу
CREATE TABLE BlobFile (
eeg_id INTEGER PRIMARY KEY,
eeg_oid OID NOT NULL
);
SMALLINT масив на канал
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 на канал у кожну епоху
CREATE TABLE EpochChannelBytea (
eeg_id INT NOT NULL,
epoch INT NOT NULL,
channel INT,
signal BYTEA NOT NULL,
PRIMARY KEY (eeg_id, epoch, channel)
);
SMALLINT 2D масив за епоху
CREATE TABLE EpochArray (
eeg_id INT NOT NULL,
epoch INT NOT NULL,
signals SMALLINT[][] NOT NULL,
PRIMARY KEY (eeg_id, epoch)
);
Масив BYTEA за епоху
CREATE TABLE EpochBytea (
eeg_id INT NOT NULL,
epoch INT NOT NULL,
signals BYTEA NOT NULL,
PRIMARY KEY (eeg_id, epoch)
);
Потім я імпортував добірку файлів EDF у кожне з цих відносин через Java JDBC і порівняв зростання розміру бази даних після кожного завантаження.
Файли були:
- Файл A: 2706 епох з 16 каналів, кожен канал - 1024 зразки (16385 зразків за епоху), 85 МБ
- Файл B: 11897 епох з 18 каналів, кожен канал - 1024 зразки (18432 проби за епоху), 418 Мб
- Файл C: 11746 епох з 20 каналів, кожен канал від 64 до 1024 зразків (17088 зразків на епоху), 382 Мб
Щодо вартості зберігання, ось розмір, зайнятий у МБ для кожного випадку:
Відносно оригінального розміру файлу Великі об'єкти були приблизно на 30-35% більшими. На противагу цьому, зберігання кожної епохи як BYTEA чи SMALLINT [] [] було менше ніж на 10%. Збереження кожного каналу як окремого кортежу збільшує 40%, як BYTEA, так і SMALLINT [], так що не набагато гірше, ніж зберігання як великого об'єкта.
Одне, що я спочатку не оцінив, - це те, що "Багатовимірні масиви повинні мати відповідні розширення для кожного виміру" в PostgreSQL . Це означає, що SMALLINT[][]
представлення працює лише тоді, коли всі канали в епоху мають однакову кількість вибірок. Отже, файл C не працює з EpochArray
відношенням.
З точки зору витрат на доступ, я не обіймався з цим, але принаймні з точки зору вставки даних спочатку було найшвидше представництво EpochBytea
і BlobFile
, EpochChannelArray
найповільніше, займало приблизно в 3 рази довше, ніж перші два.