Что такое хороший способ хранить большое количество столбцов?

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 

Кроме того, строки связаны с объектами данных.

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

Моя вторая мысль была просто иметь таблицу со всеми 240 с лишним столбцов. Я придумал несколько других способов, но они также довольно неудовлетворительные.

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

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

Есть хорошие идеи? Спасибо Джеймс

редактировать: это данные временного ряда, с измерениями столбцов на разных длинах волн. Данные захотят проанализировать в относительно узком диапазоне длин волн. Также могут быть добавлены дополнительные длины волн в какой-то момент в будущем.

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

Джеймс
источник
2
По названию столбцов я догадываюсь, что это какие-то данные наблюдательных временных рядов. Если бы это были научные данные, я бы посмотрел, есть ли у научной дисциплины типичные способы организации их данных или, по крайней мере, каковы случаи использования науки, которые используют данные.
Джо
Это действительно данные временных рядов :) Оригинальное сообщение отредактировано с немного большей информацией.
Джеймс

Ответы:

10

Вы могли бы привести случай в любом случае, но если данные будут использоваться для анализа, и вы часто хотите видеть несколько столбцов из этих данных одновременно, используйте широкую таблицу. Убедитесь, что вы знаете количество столбцов базы данных и ограничения размера строки. Убедитесь, что вы правильно поняли типы данных. Если многие столбцы имеют нулевое значение, SQL Server позволяет оптимизировать таблицу для этого. Вы также можете рассмотреть возможность использования решения NOSQL (не только SQL) для анализа данных этого типа.

Если эти данные будут меньше для анализа, вы можете их нормализовать, как указано в вашем вопросе.

Эрик Хамфри - Лотсхелп
источник
6

У меня была ситуация, очень похожая на вашу, 257 полей с 30-50 ГБ в год. В итоге я просто сохранил простую, одну длинную большую таблицу в SQL Server. Мои данные были опрошены довольно много, но в основном на дату, и это работало хорошо.

Я мог бы разбить данные на более мелкие логические фрагменты (группы по 50 или около того), но в этом случае у меня не было особого преимущества, поэтому я избавил себя от беспокойства.

Если бы мне было сейчас интересно, я мог бы рассмотреть вариант NoSQL, который лучше подходит для теории, но с критически важными данными пробовать новые вещи не всегда хорошо для нервов.

henry.oswald
источник
6

Итак, чтобы запоздало ответить на мой собственный вопрос (в конце концов, проект так и не был реализован), когда мне удалось получить немного свободного времени, я заполнил тестовую таблицу данными объемом 500 ГБ с таблицей, расположенной так:

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

Настройка базы данных была стандартной установкой PostgreSQL на старом двухъядерном компьютере с 3 ГБ оперативной памяти. Я выполнил около десятка различных запросов, просто выбирая данные по дате и размеру параметра DataSite, а также усредняя данные за 1 час, 1 день и вставляя новые порции данных. По памяти все запросы выполнялись менее чем за секунду. Это было, конечно, намного быстрее, чем я ожидал, и вполне пригодным для использования. Одной вещью, о которой я не думал, было то, что при индексированной таблице таким образом индексный файл также занимал почти 500 ГБ, поэтому наличие таблицы шириной 240 столбцов, безусловно, сэкономило бы много места на диске.

Джеймс
источник
Но при экономии места это наверняка повлияло бы на скорость индексации. Вы можете попробовать еще раз, если у вас есть возможность, и поверните ее.
Jcolebrand
3

В Postgres я бы элегантно решил эту проблему с помощью типа массива или varray в Oracle.

Gaius
источник
Это сработало бы, единственное преимущество в том, что мне нужно где-то хранить заголовки столбцов для этого DataSite, так как без них данные ничего не значат, и они могут меняться / изменяться (они не должны, но я я видел, как свиньи летают раньше ...)
Джеймс
В этом случае в моей основной таблице данных у меня будет другой столбец с именем «версия» и другая версия сопоставления таблицы с массивом заголовков столбцов (поэтому индексы массива соответствуют массиву данных).
Гай
3

Я не знаю, полезно ли это для вашей проблемы, но для столбцов мне не нужно делать прямые запросы (столбцы, которые я никогда не помещаю в мое условие WHERE), и которые являются информативными только тогда, когда я хочу получить всю информацию о некоторых конкретные строки, я объединяю их в поле блога в формате JSON.


источник
Кроме того, сожмите этот шарик. Выполните сжатие на клиенте, чтобы не создавать нагрузку на сеть и сервер.
Рик Джеймс
2

Вероятно, я бы принял окончательное решение по проекту в зависимости от распределения запрашиваемых параметров__данных. То есть, если есть несколько параметров_id, которые запрашиваются почти исключительно, я бы поместил их значения в горячую таблицу, а остальные значения - в другую холодную таблицу .

Ото, если бы их распределение запросов было более или менее равномерным, я бы загрузил выборочный набор стоимостью несколько дней в таблицу, где в одной записи хранятся все значения, чтобы увидеть, каково соотношение между записями / блоками дБ (или если есть даже проблема цепочки строк , что вполне вероятно). В зависимости от этого я бы сделал дальнейшее дизайнерское решение.

Ну, после прочтения, я бы, вероятно, применил оба подхода для принятия решения параллельно.

Рене Ниффенеггер
источник
2

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

ParameterID ссылается на другую таблицу, в которой хранятся заголовки столбцов ввода (200,00 202,50 205,00 ...).

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

Джо
источник
Под параметром я подразумеваю заголовок столбца или длину волны. Я думал о том, чтобы сделать это таким образом, но иметь 240 столов кажется немного неуклюжим :)
Джеймс
@ Джеймс ... это не должно быть 240 таблиц ... только столько, сколько уникальных ParameterIDs. В таком случае представление будет таким же широким, как количество дискретных длин волн, на которых вы проводите измерения (плюс независимые переменные). ... Возможно, вы захотите посмотреть, как сообщество OPeNDAP обрабатывает вещи, поскольку они ориентированы на данные временных рядов. Большинство данных, с которыми я имею дело, - это изображения (телескоп, коронограф, магнитограф), поэтому их материал не подходит для моей работы, поэтому я не знаю, как они справляются с хранением. (это могут быть таблицы HDF / CDF / NetCDF / ASCII).
Джо
К сожалению, есть 240 уникальных параметров :( Спасибо за ссылку :)
Джеймс
@James: также, это данные об освещенности? Если это так, вы можете спросить людей из LISIRD ... Я думаю, что они экспериментально разделяют их на отдельные наборы данных, и я не знаю, хранят ли они их в базах данных или просто в простых файлах.
Джо