Я следую решению №1 этого ответа . Через некоторое время в таблице появятся некоторые избыточные строки. Предположим, что эта таблица:
+------+------------------+ | user | cookie | +------+------------------+ | 1 | ojer0f934mf2... | | 2 | ko4398f43043... | | 2 | 34fjkg3j438t... | | 3 | 0243hfd348i4... | +------+------------------+
когда пользователь 1
удаляет файлы cookie своего браузера, эта строка существует в базе данных:
| 1 | ojer0f934mf2... |
И когда он открывает мой сайт, ему нужно снова войти в систему. Итак, вот таблица:
+------+------------------+ | user | cookie | +------+------------------+ | 1 | ojer0f934mf2... | -- now this row is useless anymore | 2 | ko4398f43043... | | 2 | 34fjkg3j438t... | | 3 | 0243hfd348i4... | | 1 | 0243hfd348i4... | +------+------------------+
Разумеется, в будущем количество таких бесполезных строк будет увеличиваться. Ну, как я могу это сделать? На самом деле я могу создать EVENT
чтобы очистить таблицу (в день) , удалив избыточные строки. Но вот проблема: как я могу их обнаружить? Как указать строку бесполезно?
EDIT: я могу добавить новый столбец и сохранить временную метку, а затем удалить все строки old-timestamp с помощью EVENT
(или заданий cron) . Но это не идеальное решение. Мне нравится, что cookie действителен до тех пор, пока пользователь не выйдет из системы (поэтому мне не нравятся ограничения (или срок действия) для файлов cookie) .
Теперь я ищу решение для определения избыточных строк (не старых строк) .
Когда пользователь выходит из системы, явным образом удаляю строку в таблице, соответствующую их текущему файлу cookie.
Для обеспечения безопасности вы должны хранить случайное значение в файле cookie в безопасном хэше cookie в таблицах базы данных (например, SHA-2).
Для работы с пользователями, которые больше не используют конкретный браузер, сохраните другое поле для Last Used Date. Обновите эту дату, как только вы обнаружите файл cookie для строки, используемой для доступа к вашему приложению.
Затем вам нужно, чтобы запланированная задача выполнялась так часто, что очистка сеансов, которые не были использованы недавно.
Добавьте еще один столбец с меткой времени. Затем запустите обычное задание cron, чтобы удалить любые строки с меткой времени, превышающей определенный порог (например, 1 день, например).
Вы можете либо помещать временную метку, либо обновлять ее каждый раз, когда вы видите этого пользователя, а это означает, что они «вышли из системы» через некоторое время после того, как они в последний раз использовали сайт (но это означает большую передачу данных); или вы можете просто поставить временную метку при создании сеанса в первый раз и никогда не прикасаться к ней снова, что приведет к «выходу из системы» x времени после последнего входа в систему (менее удобно для пользователя, но это означает, что меньше передача базы данных).
Создайте код, который проверяет пользователя, уже существующего в таблице файлов cookie.
Если идентификатор пользователя существует в столбце пользователя – просто обновите его с помощью новой информации о файлах cookie. Если идентификатор пользователя не существует, создайте новую запись.
Или вы можете проверить существующие записи, удалить их, а затем вставить новый.
Неясно, какие избыточные средства в этом случае. Нельзя различать эти две строки:
+------+------------------+ | user | cookie | +------+------------------+ | 1 | ojer0f934mf2... | -- now this row is useless anymore | 1 | 0243hfd348i4... | +------+------------------+
Если вы добавите столбец, чтобы идентифицировать первую строку, тогда проблема решается сама собой: перед каждой insert
delete
строку, которую она заменит. Нет необходимости в cron; в худшем случае каждый user
будет иметь одну оставшуюся строку в базе данных, которая будет удалена при следующем использовании.
Я также рекомендую первичный ключ для принудительного применения правила no-redundant-rows .