Хранение времени входа пользователя в пользовательскую таблицу - PullRequest
1 голос
/ 31 декабря 2011

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

UserID    midnightTo6am    6amToNoon    noonTo6pm    6pmToMidnight
User1     3                2            7            1
User2     4                9            1            8

Обратите внимание, что это часть большой таблицы, которая содержит дополнительную информацию о пользователе , такую ​​как адрес и пол, цвет волос и т. Д. И т. Д.

В этом примере, как лучше всего хранить эти данные?Должна ли она быть частью таблицы пользователей, несмотря на то, что знает, что не каждый пользователь будет входить в систему каждый раз (пользователь может никогда не войти в систему с 6 утра до полудня)?Или эта таблица является ошибкой 1NF из-за повторяющихся столбцов, которые должны быть перемещены в отдельную таблицу?

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

Если эти данные являются ошибкой 1NF и данные должны быть помещены в отдельную таблицу, как я могу гарантировать, что +1 в течение определенного времени пройдет гладко?Буду ли я искать пользователя в отдельной таблице, чтобы увидеть, не заходили ли они в это время раньше и +1?Или добавить столбец в эту таблицу, если они впервые входят в систему в течение этого периода времени?

Любые разъяснения или другие решения приветствуются!

Ответы [ 2 ]

5 голосов
/ 31 декабря 2011

Я бы порекомендовал хранить события входа в систему в журнале на основе файлов или в простой таблице, используя только ID пользователя и DATETIME имени входа.

Один раз в день или, как часто вам нужно, сообщать о данных, проиллюстрированных в вашем вопросе, объединяйте эти данные в таблицу в нужной вам форме. Таким образом, вы не выбрасываете необработанные данные и всегда можете провести повторную агрегацию за разные периоды, по часам и т. Д. Позже.

добавление: я подозреваю, что самым быстрым способом получения агрегированных данных будет выполнение ряда запросов диапазона для каждого из ваших периодов агрегации, поэтому вы ищете (например) даты входа в систему в диапазоне 2011-12-25 00:00:00 - 2011-12-24 03:00:00. Если вы идете с этим подходом, индекс (datetime, user_id) будет работать хорошо. Это кажется нелогичным, поскольку вы хотите что-то делать на основе, ориентированной на пользователя, но индекс в поле DATETIME позволит легко находить строки, а затем конечный индекс user_id позволит быстро группировать.

1 голос
/ 01 января 2012

Пара вещей. Во-первых, это не нарушение 1НФ. Делать это в виде 4 столбцов на самом деле может быть приемлемым. Во-вторых, если вы используете этот дизайн, вы не должны использовать нули, вместо этого использовать ноль (с возможным исключением существующих записей). Наконец, ЧЕГО вы должны использовать этот дизайн или разбить его на другую таблицу (или две), зависит от вашей цели и использования. Если ваше стандартное использование таблицы не использует эту информацию, она должна перейти в другую таблицу с отношением 1: 1. Если вам может потребоваться увеличить гранулярность времени входа в систему, вам следует использовать другую таблицу. Наконец, если вы разбили это на другую таблицу с отметкой времени, уделите внимание конфиденциальности.

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