Должен ли я использовать отдельную таблицу для хранения онлайн-пользователей или просто использовать дополнительные поля в таблице существующих членов? - PullRequest
1 голос
/ 18 сентября 2009

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

Мой главный вопрос сводится к следующему: Должен ли я просто добавить некоторые поля в существующую таблицу членов (last_active_time, is_user_online, hide_online_status и т. Д.) ИЛИ было бы лучше сохранить эту информацию в отдельная таблица? Моя первоначальная мысль - использовать существующую таблицу для простоты. Помимо уровня сложности, каковы преимущества / недостатки одного против другого?

Ответы [ 3 ]

2 голосов
/ 18 сентября 2009

Создать новую таблицу.

Во-первых, есть философская причина, заключающаяся в том, что один объект (читай: таблица) должен иметь одну цель. Это сильно размыто в логическом дизайне базы данных, но, тем не менее, это хороший принцип.

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

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

И, наконец, вам, вероятно, потребуются некоторые индексы, например, чтобы посмотреть, кто сейчас в сети. И эти индексы (1) займут еще больше места, (2) создадут еще больше разбросанных грязных блоков, которые должны быть физически записаны на диск, и (3) введут точку конфликта обновления.

1 голос
/ 18 сентября 2009

Я бы сохранил это в отдельной таблице. Если у вас есть миллион пользователей, и вы хотите знать, кто в сети, вы не хотите сканировать эту таблицу снова и снова, чтобы найти эту информацию. Ваш «онлайн» стол будет относительно небольшим, и у вас может быть работа, которая периодически сканирует ее для тех, кто не пришел за последние 5 минут или около того, а затем просто удаляет их из онлайн таблицы и обновляет все необходимое в таблице участников. для "last_seen"

0 голосов
/ 18 сентября 2009

Я думаю, это зависит от того, сколько пользователей вы ожидаете. Если будет всего несколько тысяч пользователей, я бы просто сделал онлайн-статус атрибутом пользователя в пользовательской таблице. Если их будет больше, то вам понадобится таблица online_users, и вы будете хранить эту информацию вместе с внешним ключом для основной таблицы пользователей. Чтобы воспользоваться преимуществами (упомянутыми выше), вам нужно будет запускать задачу каждые несколько часов, чтобы удалить неактивных пользователей из таблицы online_users.

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