Intereting Posts

Как я могу обнаружить избыточные строки в таблице?

Я следую решению №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 .