ВРЕМЯ MySQL против ДЕСЯТИЧНОГО

Я хочу хранить в БД START time и END time. Важны только hours и minutes, поэтому в форме у пользователя есть 4 выпадающих списка (start_time_hours, start_time_minutes, end_time_hours, end_time_minutes). Значения для часов - [00-23], для минут - [00, 15, 30, 45]. В конце я хотел бы иметь вычитание из обоих в десятичном виде.

Мне интересно лучше хранить 2 поля TIME (для времени начала и окончания) или 2 поля DECIMAL?

В этом случае минуты можно плавно преобразовать в десятичные числа: [00 => 00, 15 => 0,25, 30 => 0,5, 45 => 0,75], поэтому время 19:15 получится как 19:25. Я думаю, что с точки зрения хранения БД это то же самое, поскольку TIME и DECIMAL (4,2) занимают 3 байта, если я не ошибаюсь :)

Так, например, после сохранения данных в БД я возвращаюсь к редактированию формы и ожидаю, что сохраненные значения будут в этих 4 раскрывающихся списках. Если бы данные БД были типа TIME, я должен использовать что-то вроде

$hours = date('G', strtotime($start_time)) && $minutes = date('i', strtotime($start_time))

для раскрывающихся списков времени НАЧАЛА, но если данные будут ДЕСЯТИЧНЫМИ, то

$hours = floor($start_time); && $minutes = $start_time - $hours;

Какой из этих двух способов будет быстрее?

Это могут быть какие-то другие вычисления между этими двумя временами, поэтому я предполагаю, что для всех данных типа TIME это будет включать функции date() или (и) strtotime(), но для типа DECIMAL только математические функции? Итак, какое решение лучше всего подходит для скорости и БД? Может быть, есть еще лучшее решение для этого случая?

Я предполагаю, что одним недостатком DECIMAL является масштабируемость в будущем, например, если мы решим позволить пользователю выбирать минуты от 1 до 60, - тогда мы не сможем получить точное значение DECIMAL для 18:10, так как это будет 18.16666...

Я сомневаюсь, действительно ли хранения времени достаточно для того, что вы пытаетесь сделать. Например, есть ли шанс, что какое-то событие может начаться, скажем, в 23:00, а затем продолжиться до следующего дня? Если это так, то вам было бы гораздо лучше просто хранить полные даты.

Tim Biegeleisen 13.02.2019 15:08

если вас беспокоят преобразования минут в проценты с потерей точности и возможностью давать неверный результат, используйте десятичную дробь. Если вы предпочитаете более легкие времена обработки, пойдите на время. третий вариант может состоять в том, чтобы хранить только минуты. 630 в примере 10:30. (минут / 60) часов (минут % 60) минут

Cid 13.02.2019 15:14

MySQL позволяет вычитать время. Почему тогда вы хотите сохранить его как десятичное число?

Salman A 13.02.2019 15:23

@TimBiegeleisen Я понимаю, и это хороший момент, но в этом случае требуется, чтобы это не было между двумя датами.

Gaccho 13.02.2019 16:13

@Cid Ty, этот третий вариант сохраняет 1 байт в БД (при использовании smallint), но также может добавить дополнительные вычисления, например, на этапе редактирования формы для раскрывающихся списков это должно быть $hours = floor($start_time/60) ; && $минуты = $start_time - $часы; (1 дополнительный дивизион :) )

Gaccho 13.02.2019 16:23

@SalmanA Вот что я хочу выяснить, что будет лучше. Разве дата MySQL (а также дата PHP) не работают/манипуляции медленнее, чем числовые манипуляции?

Gaccho 13.02.2019 16:32

@Gaccho Я бы не стал беспокоиться о замедлении, если данные хранятся так, как должны быть. Кроме того, хранение данных в неправильном типе данных может привести к замедлению.

Salman A 14.02.2019 07:17
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
7
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я рекомендую тип TIME. Тип времени имеет большее значение. Возможно, десятичный тип иногда немного быстрее, чем тип TIME. Но когда вы используете десятичную дробь, вы должны убедиться, что все вычисляют правильно везде, а не только в вашем коде. Я думаю, что это важнее, чем размер и скорость.

Другие вопросы по теме