Пожалуйста, посмотрите на изображение моей таблицы ниже, мои вопросы касаются выполнения UPDATE
и SELECT
в столбце sensor_values
.
sensor_values
столбец - это массив длиной 86 400, соответствующий значению датчика в каждую секунду дня. Сейчас я настроил его как тип данных JSON
.
Мои вопросы
Как мне выполнить UPDATE
для указанного индекса c?
- т.е. Изменить 5-ую секунду дня или индекс
[4]
на значение 300.25
Как мне SELECT
первые 300 секунд дня? псевдокод ниже
SELECT sensor_values[0:299] FROM facts WHERE d_date = '2020-03-10' AND dim_tag = 'Water_Temp'
Вот ссылка на DBFiddle для PostGresql, делающего что-то очень похожее на то, что я пытаюсь выполнить sh в MariaDB. https://dbfiddle.uk/?rdbms=postgres_12&fiddle=6999d2607c48a809ff995c8844c7f7bb
РЕДАКТИРОВАТЬ: общий обзор моей системы ниже
У меня есть Python конвейер данных, который читает значения тысяч датчиков и выполняет расчеты. Он отвечает за суммирование всех данных, хранящихся в других таблицах.
Мне нужны данные на втором уровне, чтобы они были легко доступны для анализа, что я пытаюсь сделать так, как об этом говорится в этой проблеме. , Моя мысль - получить второе число текущего дня в Python и использовать его в качестве индекса массива для обновления, как показано ниже:
now = datetime.datetime.now()
midnight = now.replace(hour=0, minute=0, second=0, microsecond=0)
secondsSinceMidnight = (now - midnight).seconds
sensorValue = 300.25
sensorTag = "Water_Temp"
sqlQuery =
"""
UPDATE facts
SET sensor_values[%s] = %s
WHERE d_date = %s AND dim_tag = %s
"""
sqlValues = secondsSinceMidnight, sensorValue, datetime.datetime.today().strftime('%Y-%m-%d'), sensorTag
dbOps.update(sqlQuery, sqlValues)
Я не хочу отслеживать значения в Python в течение всего дня, а затем выполните INSERT
, потому что в случае сбоя программы я потеряю все данные, а использование предварительно сформированного массива 1052 * позволит мне быстро программно определить, где отсутствуют данные в другие области моей программы (т.е. sensor_value
- это 0
для набора секунд в дне).
Я использую термин предварительно сформированный массив , потому что я планирую периодически проверять свою программу на предмет наличия строки, доступной для каждого датчика на текущий и следующий день, обеспечивая плавные переходы в полночь, так как зерно очень мало.
Как и предполагалось в ответе Билла Карвина, это был мой первый подход - однако есть тысячи датчиков, и каждый из них будет публиковать каждую секунду. База данных будет расти в геометрической прогрессии: 1000 * 86400 = 86.4M
строк вводится в день.
Таким образом, это не обязательно должно быть JSON
, просто массив, модифицируемый в этом формате. Я думал, что это был правильный подход с MySQL
. Обновлено название поста, чтобы лучше отражать проблему.