Как сохранить дату рождения и возраст, чтобы можно было ежедневно обновлять возраст в PHP / MySQL? - PullRequest
4 голосов
/ 20 марта 2012

Как мне хранить дату рождения в MySQL, чтобы я мог ежедневно обновлять возраст каждого с помощью задания Cron?

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

Если да, то как мне 1) хранить дату рождения и 2) вычислять возраст каждый день?

Я могу представить себе, что ежедневный скрипт cron сначала отфильтровывает пользователя, чей месяц рождения не является текущим месяцем, затем отфильтровывает пользователя, чей день рождения не является текущим днем, а затем увеличивает его на единицу по возрасту каждого пользователя. влево.

Имеет ли это смысл? Если так, то как бы я это сделал? Есть ли лучший способ сделать все это?

Ответы [ 5 ]

13 голосов
/ 20 марта 2012

Простой ответ - нет; никогда не храните возраст людей. Он меняется для каждого человека в год, но, как вы говорите, вы должны ежедневно проверять, правильно ли он для каждого человека.

Сохраните только дату рождения, а затем рассчитайте возраст при выборе из базы данных. Это всего лишь today - date of birth, поэтому он почти не требует процессоров.

EDIT:

Чтобы расширить мой комментарий в Ответ 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.

3 голосов
/ 20 марта 2012

Нет, не храните возраст, просто рассчитайте его в своих запросах.Что касается дня рождения, я предпочитаю, чтобы все мои дата / время были в метках времени Unix (потому что я ненавижу иметь дело с переносимостью через настройки локали, изменяющие формат даты)

2 голосов
/ 20 марта 2012

Имеет ли смысл хранить возраст

Нет.

Мне не нужно рассчитывать каждый возраст на лету итратить ресурсы ЦП?

На самом деле, вы бы потратили еще на миллион дополнительных «ресурсов ЦП» (о которых у вас слишком смутное представление, чтобы о них беспокоиться) при ежедневном обновлении.

Есть ли лучший способ сделать все это?

Сохранить дату рождения и рассчитать возраст в выбранное время

что если выхотите узнать всех тех, чей возраст больше 25, но меньше 30?

это довольно тривиальный запрос, подобный этому

WHERE birth_date BETWEEN date_sub(curdate(), INTERVAL 25 YEAR) 
                     AND date_sub(curdate(), INTERVAL 30 YEAR)

запрос будет использовать индекс (если таковые имеются) и, таким образом, будут гореть быстро, без каких-либо [ненужных] денормализаций

0 голосов
/ 12 декабря 2012

Я не думаю, что полностью верно, что компьютерный возраст динамически отнимает много памяти.Почему бы не создать таблицу КАЛЕНДАРЬ с 365 строками по 1 строке на каждый день года.И сохраните список идентификаторов пользователей против дня, соответствующего их дню рождения.Для каждого дня просто обратитесь к записи таблицы для этого дня и обновите возраст только тех выбранных пользователей.Это значительно снизит сложность, даже когда пользовательская база увеличится.

0 голосов
/ 20 марта 2012

Я собираюсь пойти против большинства всех ответов здесь.

Я бы запомнил оба ...

  • обновление возраста выполняется быстро и просто - один запрос mysql может выполняться каждый день, и его выполнение
  • вычисление возраста занимает много времени, если у вас много просмотров страниц - количество просмотров значительно превышает количество изменений

Только представьте себе сценарий таблицы - таблицу с 100 или 1000 строками, которая показывает возраст человека ... сколько времени это займет для вычисления ???

Я всегда думал, что Stackoverflow вычисляет репутацию динамически, но вы можете увидеть в Обозревателе данных Stackoverflow , что они не видят - см. Объект User в схеме справа. Он записывается и обновляется каждый раз, когда его изменяют - я предполагаю, что это чисто из-за того, что количество просмотров значительно превышает количество изменений

...