2013-08-09 4 views
1

У меня есть таблица со следующей структурой и данными, представляющего состояние парковочного залива:Используя представление или триггер для предварительных обработки данных

id bayID state  starttime 
1 1  FREE  2013-08-09 09:13:02 
2 1  OCCUPIED 2013-08-09 09:15:50 
3 1  FREE  2013-08-09 09:33:15 
4 1  OCCUPIED 2013-08-09 09:35:10 
5 1  FREE  2013-08-09 10:03:22 

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

Моя идея состояла в том, чтобы предварительно обработать данные из таблицы выше в другую таблицу, где время парковки уже рассчитано. Это можно было бы сделать, найдя пару OCCUPIED и FREE записей для бухты, а затем вычислить разницу во времени между временем начала. Это может дать мне структуру, как это:

bayID starttime    duration 
1  2013-08-09 09:15:50 ... 
1  2013-08-09 09:35:10 ... 

я мог бы запросить между 2 DateTimes и средних величин длительности.

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

  • создать триггер, который выполняется после вставки в первой таблице, делает расчет и вставки в другую таблицу, если это необходимо.
  • создать a на первом столе. У меня недостаточно знаний MySQL, чтобы знать, возможно ли это, к сожалению.

Перед тем, как погрузиться в кодирование, может ли кто-нибудь дать мне несколько советов по предлагаемым решениям? Являются ли они оба выполнимыми и какими будут (dis) преимущества использования одного или другого?

ответ

1

Вы ищете советы, так вот мои два цента ...

ли они осуществимым

MySQL поддерживает как триггеры и представления. Таким образом, технически говоря, оба решения возможны.

  • создать триггер, который выполняется после вставки в первой таблице, делает расчет и вставки в другую таблицу, если это необходимо.
  • создать вид на первом столе. У меня недостаточно знаний MySQL, чтобы знать, возможно ли это, к сожалению.

Использование триггера, кажется, интересный подход на первом, так как это даст вам автоматическое обновление вашей оккупационной таблицы. Но это увеличит нагрузку на вашу БД в среднем, возможно, до неприемлемого пункта, если он уволен часто. На «хорошей стороне» запрос в триггере, вероятно, будет более легким, чем с другим решением.

Поддержка MySQL просмотров, но вы должны помнить, что это статический снимок, созданный во время создания представления. В MySQL нет таких вещей, как «живые представления».Это означает, что вам нужно будет заново создать, который просматривается на периодической основе (cronjob?). Скажи раз в ночь? В зависимости от ваших потребностей эта задержка может быть или не быть приемлемой. Кроме того, поскольку вы сказали, что у вас есть миллионы записей, вероятно, ночная консолидация данных может поставить важную нагрузку на БД в то время. Если вы используете приложение 24/7, это может быть неприемлемым.

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

Надеется, что это помогает, по крайней мере немного;)


Смежные вопросы