Как я должен хранить дату рождения в MySQL, чтобы я мог легко обновлять возраст каждого на ежедневной основе с помощью Cron Job?
Имеет ли смысл даже хранить возраст и дату рождения, чтобы при поиске с использованием возраста мне не приходилось вычислять каждый возраст на лету и тратить ресурсы ЦП?
Если да, то как мне 1) хранить дату рождения и 2) вычислять возраст каждый день?
Я могу представить себе, что ежедневный скрипт cron сначала отфильтровывает пользователя, чей месяц рождения не является текущим месяцем, затем отфильтровывает пользователя, чей день рождения не является текущим днем, а затем увеличивает на единицу возраст каждого оставшегося пользователя.
Имеет ли это смысл? Если так, как бы я это сделал? Есть ли лучший способ сделать все это?
Простой ответ — нет; никогда не храните возраст людей. Он меняется для каждого человека в год, но, как вы говорите, вы должны ежедневно проверять, правильно ли это для каждого человека.
Сохраните только дату рождения, а затем рассчитывайте возраст при выборе из базы данных. Это только today - date of birth
так что почти не занимает процессоров вообще.
РЕДАКТИРОВАТЬ:
Чтобы расширить мой комментарий в ManseUK ответ есть также вероятность отказа. Что произойдет, если ваш сервер / база данных не работает? Или ваше обновление не запускается в указанное время? Или кто-то приходит и запускает его вручную после того, как обновление уже было запущено на эту дату? Или кто-то выключает ваш планировщик? Там нет никакой опасности этого произойдет, если вы рассчитываете Age
как вы выбираете из базы данных.
Чтобы выбрать возраст от 25 до 30 лет с учетом столбца ДАТА dateofbirth
Ваш запрос будет выглядеть примерно так:
select *
from users
where dateofbirth between date_add( curdate(), interval -30 year )
and date_add( curdate(), interval -25 year )
обеспечивать users
индексируется на dateofbirth
,
Нет, не храните возраст, просто рассчитайте его в своих запросах. Что касается дня рождения, я предпочитаю, чтобы все мои дата / время были в метках времени Unix (потому что я ненавижу иметь дело с переносимостью через настройки локали, изменяющие формат даты)
Имеет ли смысл хранить Age
Нет.
Мне не нужно рассчитывать каждый возраст на лету и тратить ресурсы процессора?
На самом деле, вы бы потратили еще миллион «ресурсов ЦП» (о которых у вас слишком смутное представление, чтобы о них беспокоиться) при ежедневном обновлении.
Есть ли лучший способ сделать все это?
Сохраните дату рождения и рассчитайте возраст в выбранное время
Что делать, если вы хотите узнать всех тех, чей возраст больше 25, но меньше 30?
это довольно тривиальный запрос, как этот
WHERE birth_date BETWEEN date_sub(curdate(), INTERVAL 25 YEAR)
AND date_sub(curdate(), INTERVAL 30 YEAR)
запрос будет использовать индекс (если таковой имеется) и, следовательно, будет быстрым, без каких-либо [ненужных] денормализаций
Я собираюсь пойти против большинство все ответы здесь.
Я бы сохранил оба …
Просто представьте себе сценарий таблицы — таблицу с 100 или 1000 строками, которая показывает возраст человека … сколько времени это займет для вычисления ???
Я всегда думал, что Stackoverflow вычисляет репутацию динамически, но вы можете увидеть на Stackoverflow — исследователь данных что они не видят — см. объект User в схеме справа. Он записывается и обновляется каждый раз, когда его изменяют — я предполагаю, что это чисто из-за того, что количество просмотров значительно превышает количество изменений.
Я не думаю, что это правда, что компьютерный век динамически отнимает много памяти.
Почему бы не создать таблицу КАЛЕНДАРЬ с 365 строками по 1 строке на каждый день года. И сохраните список идентификаторов пользователей против дня, соответствующего их дню рождения.
Для каждого дня просто обратитесь к записи таблицы для этого дня и обновите возраст только тех выбранных пользователей.
Это значительно снизит сложность, даже когда пользовательская база увеличится.