Який хороший спосіб зберігати велику кількість стовпців?


18

У мене є проблема з вирішенням питання, як зберігати ці дані в моїй базі даних. Будь-які пропозиції щодо найкращого способу це зробити? Не можу сказати, я багато чого знаю про бази даних.

У мене дані надходять у такому форматі, але замість 4, кількість стовпців становить приблизно 240, тому кожна дата має 240 унікальних значень, пов’язаних із цим:

Date/Time 200,00 202,50 205,00  
2010.11.12  13:34:00  45,8214 43,8512  41,5369   
2010.11.12  13:35:00  461,9364  454,2612  435,5222 

Також рядки пов'язані з DataSites.

Першою моєю думкою було створення такої таблиці: DataID (pk), DataSiteID, ParameterID, Date, Value, з індексом на DataSite, Parameter та Date. Параметр ID відноситься до іншої таблиці, в якій зберігаються заголовки вхідних стовпців (200,00 202,50 205,00 ...).

Друга моя думка полягала в тому, щоб просто мати таблицю з усіма 240 непарними стовпцями. Я придумав кілька інших способів, але вони також досить незадовільні.

Проблема, яку я маю з моїм першим рішенням (не така вже й величезна проблема, але мені це не подобається), полягає в тому, що Дата і DataSiteID будуть повторюватися для всіх 240 значень у цьому вхідному рядку, тому він використовує зовсім небагато додаткового простору.

Щорічно надходитиме близько 40 Гб даних (у вищенаведеному текстовому форматі), а дані будуть шукати за DataSite, Parameter та Date. Кількість даних, що надходять, швидше за все, збільшиться в чотири роки за рік.

Якісь гарні ідеї? Спасибі, Джеймс

редагувати: це дані часових рядів, стовпці - це вимірювання на різній довжині хвилі. Дані потрібно буде проаналізувати у відносно вузькому діапазоні довжин хвиль. Можуть також бути додані додаткові довжини хвиль у якийсь момент у майбутньому.

редагувати: Спасибі за відповіді, хлопці, я дуже це вдячний :) Я думаю, що, напевно, я можу знайти час для проведення експериментів із 500 тестовими даними тестування. Я опублікую з будь-якими висновками;)


2
З назви стовпців я здогадуюсь, що це якісь дані спостережуваних часових рядів. Якщо це дані про науку, я хотів би побачити, чи є в науковій дисципліні типові способи впорядкування своїх даних або, принаймні, які випадки використання науки використовують для використання цих даних.
Джо

Це справді дані часових рядів :) оригінальний пост, відредагований з трохи більшою інформацією.
Джеймс

Відповіді:


10

Ви можете зробити випадок у будь-якому випадку, але якщо дані будуть використовуватися для аналізу, і вам часто хочеться бачити кілька стовпців із цих даних одночасно, перейдіть до широкої таблиці. Переконайтеся, що ви знаєте обмеження кількості та розміру рядків у базі даних. Переконайтеся, що ви правильно зрозуміли типи даних. Якщо багато стовпців є недійсними, SQL Server дозволяє оптимізувати таблицю для цього. Ви також можете розглянути можливість використання рішення NOSQL (не тільки SQL) для аналізу цього типу даних.

Якщо цих даних буде менше для аналізу, ви можете їх нормалізувати, як зазначено у вашому запитанні.


6

У мене була дуже схожа ситуація з вашою, 257 полів із 30-50 гбіт на рік. Я закінчив просто просто, один довгий великий хлопчий стіл у SQL Server. Мої дані були запитані справедливо, але в основному на дату, і вони працювали добре.

Я міг би розбити дані на логічні менші патрони (групи по 50 і більше), але в цьому випадку насправді не було великої переваги, тому я врятував себе набрид.

Якби я відчував фантазію зараз, я міг би розглянути варіант NoSQL, який найкраще підходить теоретично, але, якщо критичні дані місії намагаються викласти нові речі, це не завжди чудово для нервів.


6

Отже, щоб запізніло відповісти на моє власне питання (проект ніколи не закінчувався в кінцевому підсумку), коли мені вдалося отримати трохи вільного часу, я заповнив тестову таблицю з 500 ГБ даних та таблицею, влаштованою так:

Першою моєю думкою було створення такої таблиці: DataID (pk), DataSiteID, ParameterID, Date, Value, з індексом на DataSite, Parameter та Date. Параметр ID відноситься до іншої таблиці, в якій зберігаються заголовки вхідних стовпців (200,00 202,50 205,00 ...).

Налаштування бази даних було стандартною установкою PostgreSQL на старій двоядерній машині з 3 ГБ оперативної пам’яті. Я провів близько десятка різних запитів, просто підбираючи дані за датою DataSite та ParameterID, усереднюючи дані за часовий проміжок часу, 1 денний період та вставляючи нові фрагменти даних. З пам’яті всі запити займали менше секунди. Це, звичайно, набагато швидше, ніж я очікував, і цілком корисний. Я не замислювався над тим, що з індексованою таблицею таким чином файл індексу був майже 500 ГБ, тож натомість таблиця, що має широку колонку 240, замість цього, безумовно, заощадить багато місця на диску.


Але заощаджуючи простір, це найбезпечніше вплине на швидкість індексації. Ви можете спробувати ще раз, якщо отримаєте шанс, і вперед і поверніть її.
jcolebrand

3

У Postgres я б елегантно вирішив це за допомогою типу масиву або varray в Oracle.


Це спрацювало б, єдиний улов полягає в тому, що мені потрібно буде десь зберігати заголовки стовпців для цього DataSite, так як без цього дані нічого не означають, і вони можуть змінюватися / змінюватися (вони не повинні, але я ' Ви бачили, як свині літають раніше ...)
Джеймс

У такому випадку у моїй головній таблиці даних у мене був би інший стовпець під назвою "версія" та інша версія таблиці, яка відображає масив заголовків стовпців (таким чином, індекси масиву відповідають масиву даних).
Гай

3

Я не знаю, чи корисно це для вашої проблеми, але для стовпців мені не потрібно робити прямі запити на (команди, які я ніколи не ставив у свій стан WHERE), і які є лише інформативними, коли я хочу отримати всю інформацію про деякі конкретні рядки, я поєдную їх у полі блогу, відформатованому JSON.


Крім того, стисніть цю краплину. Робіть стиснення в клієнті, щоб ви не додавали тягаря мережі та серверу.
Рік Джеймс

2

Можливо, я б прийняв остаточне рішення дизайну залежним від розподілу запитуваних_ параметрів_ids. Тобто, якщо є кілька параметрів_ids, які запитуються майже виключно, я б помістив їх значення в гарячу таблицю, а решта - в іншу холодну таблицю .

Ото, якщо їх розподіл запитів більш-менш рівномірний, я завантажую набір зразків вартістю декількох днів у таблицю, де одна запис зберігає всі значення, щоб побачити, яке співвідношення між записами / db-блоками (або якщо є навіть проблема з ланцюжком міжряддя , що, ймовірно). Залежно від цього я б тоді прийняв подальше дизайнерське рішення.

Ну, прочитавши це, я, певно, зробив би обидва підходи до вирішення рішення паралельно.


2

Я перечитував запитання - якщо я маю це правильно, то в кожному записі, який ви отримуєте як вхід, відслідковуються різні значення (засновані на ParameterID):

Параметр ID відноситься до іншої таблиці, в якій зберігаються заголовки вхідних стовпців (200,00 202,50 205,00 ...).

... Я не знаю достатньо про те, як ви взаємодієте з даними, але я схильний би перейти з іншим варіантом - мати окрему таблицю для кожного ідентифікатора параметра, а потім, якщо необхідно, мати вигляд, який би приєднайте різні параметри за датою та місцеположенням до ширшої (240 колонки) таблиці; якщо важливо було зберегти DataID доступним для перегляду, тоді ви можете скористатись, UNIONа не a JOIN, але стовпці будуть малонаселеними.


Під параметром я маю на увазі заголовок стовпця або довжину хвилі. Я думав зробити це так, але, маючи 240 столів, трохи незграбно :)
Джеймс,

@James ... це не повинно бути 240 таблиць ... лише стільки, скільки унікальні ParameterIDs. Тоді представлення буде таким же широким, як кількість дискретних довжин хвиль, у яких ви вимірюєте (плюс незалежні змінні). ... Ви можете поглянути на те, як спільнота OPeNDAP поводиться з речами, орієнтуючись на дані часових рядів. Більшість даних, з якими я маю справу, - це зображення (телескоп, коронограф, магнітограф), тому їхні речі не відповідають моїй роботі, тому я не знаю, як вони обробляють зберігання. (це можуть бути просто таблиці HDF / CDF / NetCDF / ASCII).
Джо

На жаль, існує 240 унікальних параметрів :( Дякую за посилання :)
James

@James: також дані про опромінення? Якщо це так, ви можете запитати людей у LISIRD ... Я думаю, що вони розділяють їх на окремі набори даних експериментом, і я не знаю, чи зберігають вони їх у базах даних або просто в плоских файлах.
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.