У меня проблема с решением, как сохранить эти данные в моей базе данных. Любые предложения о том, как это сделать? Я не очень разбираюсь в базах данных, могу добавить.
У меня есть данные, поступающие в таком формате, но вместо 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 или около того тестовых данных. Я выложу обратно с любыми выводами;)
источник
Ответы:
Вы могли бы привести случай в любом случае, но если данные будут использоваться для анализа, и вы часто хотите видеть несколько столбцов из этих данных одновременно, используйте широкую таблицу. Убедитесь, что вы знаете количество столбцов базы данных и ограничения размера строки. Убедитесь, что вы правильно поняли типы данных. Если многие столбцы имеют нулевое значение, SQL Server позволяет оптимизировать таблицу для этого. Вы также можете рассмотреть возможность использования решения NOSQL (не только SQL) для анализа данных этого типа.
Если эти данные будут меньше для анализа, вы можете их нормализовать, как указано в вашем вопросе.
источник
У меня была ситуация, очень похожая на вашу, 257 полей с 30-50 ГБ в год. В итоге я просто сохранил простую, одну длинную большую таблицу в SQL Server. Мои данные были опрошены довольно много, но в основном на дату, и это работало хорошо.
Я мог бы разбить данные на более мелкие логические фрагменты (группы по 50 или около того), но в этом случае у меня не было особого преимущества, поэтому я избавил себя от беспокойства.
Если бы мне было сейчас интересно, я мог бы рассмотреть вариант NoSQL, который лучше подходит для теории, но с критически важными данными пробовать новые вещи не всегда хорошо для нервов.
источник
Итак, чтобы запоздало ответить на мой собственный вопрос (в конце концов, проект так и не был реализован), когда мне удалось получить немного свободного времени, я заполнил тестовую таблицу данными объемом 500 ГБ с таблицей, расположенной так:
Настройка базы данных была стандартной установкой PostgreSQL на старом двухъядерном компьютере с 3 ГБ оперативной памяти. Я выполнил около десятка различных запросов, просто выбирая данные по дате и размеру параметра DataSite, а также усредняя данные за 1 час, 1 день и вставляя новые порции данных. По памяти все запросы выполнялись менее чем за секунду. Это было, конечно, намного быстрее, чем я ожидал, и вполне пригодным для использования. Одной вещью, о которой я не думал, было то, что при индексированной таблице таким образом индексный файл также занимал почти 500 ГБ, поэтому наличие таблицы шириной 240 столбцов, безусловно, сэкономило бы много места на диске.
источник
В Postgres я бы элегантно решил эту проблему с помощью типа массива или varray в Oracle.
источник
Я не знаю, полезно ли это для вашей проблемы, но для столбцов мне не нужно делать прямые запросы (столбцы, которые я никогда не помещаю в мое условие WHERE), и которые являются информативными только тогда, когда я хочу получить всю информацию о некоторых конкретные строки, я объединяю их в поле блога в формате JSON.
источник
Вероятно, я бы принял окончательное решение по проекту в зависимости от распределения запрашиваемых параметров__данных. То есть, если есть несколько параметров_id, которые запрашиваются почти исключительно, я бы поместил их значения в горячую таблицу, а остальные значения - в другую холодную таблицу .
Ото, если бы их распределение запросов было более или менее равномерным, я бы загрузил выборочный набор стоимостью несколько дней в таблицу, где в одной записи хранятся все значения, чтобы увидеть, каково соотношение между записями / блоками дБ (или если есть даже проблема цепочки строк , что вполне вероятно). В зависимости от этого я бы сделал дальнейшее дизайнерское решение.
Ну, после прочтения, я бы, вероятно, применил оба подхода для принятия решения параллельно.
источник
Я перечитывал вопрос - если я правильно понял, то в каждой записи, которую вы получаете в качестве входных данных, отслеживаются различные значения (основанные на ParameterID):
... Я не знаю достаточно о том, как вы взаимодействуете с данными, но я был бы склонен пойти с другим вариантом - иметь отдельную таблицу для каждого идентификатора параметра, а затем при необходимости иметь представление, которое будет объединить различные параметры по дате и местоположению в более широкую таблицу (240 столбцов); если было важно сохранить доступность DataID в представлении, вы можете использовать
UNION
вместо aJOIN
, но столбцы будут заполняться редко.источник
ParameterID
s. В таком случае представление будет таким же широким, как количество дискретных длин волн, на которых вы проводите измерения (плюс независимые переменные). ... Возможно, вы захотите посмотреть, как сообщество OPeNDAP обрабатывает вещи, поскольку они ориентированы на данные временных рядов. Большинство данных, с которыми я имею дело, - это изображения (телескоп, коронограф, магнитограф), поэтому их материал не подходит для моей работы, поэтому я не знаю, как они справляются с хранением. (это могут быть таблицы HDF / CDF / NetCDF / ASCII).