一尘不染

如何检测表中的多余行?

sql

我下面的 解决方案#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,通过删除多余的行来 每天(每天)
清理该表。但这是问题所在:如何检测到它们?如何指定无用的行?


编辑: 我可以添加一个新列并存储时间戳,然后通过EVENT (或cron作业)
删除所有旧的时间戳行。但这不是一个完美的解决方案。我希望Cookie在用户注销之前一直有效 (因此,我不喜欢Cookie的任何限制(或到期时间))

现在,我正在寻找确定多余行 (而不是旧行) 的解决方案。


阅读 159

收藏
2021-03-17

共1个答案

一尘不染

当用户注销时,在表中显式删除与其当前cookie相对应的行。

为了安全起见,您应该在cookie中的随机值中存储一个随机值,并将其存储在数据库表中cookie的安全散列中(例如SHA-2)。

为了与不再使用特定浏览器的用户打交道,请为“上次使用日期”存储另一个字段。一旦检测到用于访问应用程序的行的cookie,请立即更新此日期。

然后,您将希望调度的任务每隔一段时间运行一次,以清理最近未使用过的会话。

2021-03-17