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

StackOverflow https://stackoverflow.com/questions/1445617

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top