Для начала вы, вероятно, представили бы одну таблицу, так как это была бы наиболее нормализованная форма. В таблице будет просто запись для каждого полученного вами попадания, в каждой строке будет указана дата / время этого попадания.
Теперь, таким образом, чтобы получить статистику за каждый час, день, неделю и т. Д., Запросы просты, но вашей базе данных придется выполнить довольно тяжелую работу с запросами. В частности, запросы, в которых используются суммы, числа или средние значения, должны извлекать все соответствующие строки.
Вы можете обойти это, предварительно рассчитав требуемые значения во второй таблице и убедившись, что регулярно синхронизируете эту таблицу с первой. Проблема в том, что вы сами будете нести ответственность за синхронизацию этого кэша.
Это, вероятно, будет включать в себя создание строки для каждого часа. По-прежнему будет намного быстрее выполнять запрос в течение дня или месяца, если вы выбираете не более 24 строк в день.
Ваше другое предложение состояло в том, чтобы собрать его с самого начала, никогда не сохраняя каждый удар в виде строки. Вы, вероятно, сделаете это, как и раньше, с строкой за каждый час. Каждое попадание будет увеличивать соответствующий ряд часов на один. Вы будете иметь данные только в одном месте, и они уже будут довольно хорошо обобщены.
Причина, которую я предлагаю по часам, а не по дням, заключается в том, что это все еще дает вам возможность поддерживать несколько часовых поясов. Если ваша гранулярность относится только к дню, у вас нет такой возможности.