ในกรณีที่ไม่มีคำตอบใด ๆ ฉันได้สำรวจปัญหานี้เพิ่มเติมด้วยตนเอง
ดูเหมือนว่าฟังก์ชั่นที่ผู้ใช้กำหนดสามารถจัดการกับประเภทฐานทั้งหมดรวมถึง 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 epochs 16 ช่องแต่ละตัวอย่าง 1024 ตัว (16385 ตัวอย่างต่อ epoch), 85 MB
- ไฟล์ B: 11897 ยุค 18 ช่องแต่ละตัวอย่าง 1024 ตัว (18432 ตัวอย่างต่อยุค) 418 MB
- ไฟล์ C: 11746 epochs 20 ช่องแต่ละตัวอย่าง 64 ถึง 1024 ตัวอย่าง (17088 ตัวอย่างต่อยุค), 382 MB
ในแง่ของค่าใช้จ่ายในการจัดเก็บนี่คือขนาดที่ครอบครองเป็น MB สำหรับแต่ละกรณี:
สัมพันธ์กับขนาดไฟล์ต้นฉบับวัตถุขนาดใหญ่มีขนาดใหญ่ขึ้นประมาณ 30-35% ในทางตรงกันข้ามการจัดเก็บแต่ละยุคเป็น BYTEA หรือ SMALLINT [] [] ใหญ่กว่าน้อยกว่า 10% การจัดเก็บแต่ละช่องเป็นสิ่งอันดับแยกเพิ่มขึ้น 40% ทั้ง BYTEA หรือ SMALLINT [] ดังนั้นจึงไม่แย่กว่าการจัดเก็บเป็นวัตถุขนาดใหญ่
สิ่งหนึ่งที่ผมไม่เคยได้รับการชื่นชมแรกนั่นคือ "อาร์เรย์หลายมิติต้องมีขอบเขตที่ตรงกันสำหรับแต่ละมิติ" ใน PostgreSQL ซึ่งหมายความว่าการSMALLINT[][]
แสดงนั้นจะทำงานได้เมื่อทุกช่องในยุคมีจำนวนตัวอย่างเท่ากัน ดังนั้นไฟล์ C ล้มเหลวในการทำงานกับEpochArray
ความสัมพันธ์
ในแง่ที่เป็นค่าใช้จ่ายในการเข้าถึงผมไม่ได้เล่นรอบกับเรื่องนี้ แต่อย่างน้อยในแง่ของการใส่ข้อมูลในขั้นต้นเป็นตัวแทนที่เร็วที่สุดที่เป็นEpochBytea
และBlobFile
มีEpochChannelArray
ที่ช้าที่สุดการประมาณ 3 ครั้งเป็นเวลานานเป็นสองคนแรก