php - 存储和显示最近访问过他人页面的人员的最有效的数据库方法是什么?

标签 php mysql sql

我有一个博客程序(有点像 Twitter),我目前正在制作一个最近访问过的框,其中包含最近访问过您页面的 9 个人。

每个人都使用不同的用户名注册。

我目前拥有的是这样的数据库:

-----------------------------
| id | username | who_visit |
-----------------------------

例如,如果 9 个用户 foo1foo9 访问了 foo10 的页面,数据库将填充一行:

------------------------------------------------------------------------
| id | username |                       who_visit                      |
------------------------------------------------------------------------
| 1  |  foo10   | foo1, foo2, foo3, foo4, foo5, foo6, foo7, foo8, foo9 |
------------------------------------------------------------------------

然后,当 foo11 访问 foo10 的页面时,我会从字符串末尾删除 foo9 ,并添加 foo11 到前面。

但现在的主要问题是,如果foo1访问了foo10的页面,然后foo2访问了foo10怎么办> 的页面,然后 foo1 再次访问 foo10 的页面?然后我必须搜索 9 个用户,删除所有重复项,将这个用户放在前面,然后继续执行。但问题是,那么它只会显示 8 行。

我能想到的解决这个问题的唯一方法是创建一个像这样的数据库:

-----------------------------
| id | username | who_visit |
-----------------------------

我不会将它们填充在一行中,而是为每次访问添加一个新行:

-----------------------------
| id | username | who_visit |
-----------------------------
| 1  |  foo10   |    foo1   |
-----------------------------
| 2  |  foo10   |    foo2   |
-----------------------------
| 3  |  foo10   |    foo3   |
-----------------------------
| 4  |  foo10   |    foo4   |
-----------------------------
| 5  |  foo10   |    foo5   |
-----------------------------
| 6  |  foo10   |    foo6   |
-----------------------------
| 7  |  foo10   |    foo7   |
-----------------------------
| 8  |  foo10   |    foo8   |
-----------------------------
| 9  |  foo10   |    foo9   |
-----------------------------

但是这样会占用大量不必要的空间。

有没有一种我错过的方法,可以有效地解决这个问题,而无需为数据库中的一个用户添加超过 50000 行?

更新:对于那些有同样问题的人,正如 PM 77-1 在下面的评论中所述,可以在插入新行时删除最早的重复行。这样,您就不会出现“数据膨胀”。

最佳答案

你的第二种方法是最好的。当我第一次开始在我的应用程序中实现数据库时,我尝试了您的第一种方法。当您想要扩展或更改数据集的处理方式时,它会产生问题。

如果索引正确,那么快速排序这些数据应该没有问题。

您仍然想从 whovisit 表中删除最旧的行。这将阻止您的 50k 条目。理论上,您在 whovisit 表中只为每个用户保留 9 条记录。所以你的实际表大小将是 9*Number_of_users

表一用户

id   |  username
-----|-----------
1    |  foo1
2    |  foo2

表二访问者

id   |  user(id) | visited(userId) | Date/time stamp
-----|-----------------------------|----------------
1    |  1        |  2              | 9999-12-31 23:59:59

当您插入新访问的查询时,用户 ID 并获取行数。如果少于 9 行,则可以,如果超过 9 行,则删除最旧的一行,总共为用户留下 9 行。

关于php - 存储和显示最近访问过他人页面的人员的最有效的数据库方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317512/

相关文章:

php - WordPress $wpdb->get_results() 不返回值

php - 从数据库中获取组并将其显示为菜单链接

mysql - SQL语法——左连接

sql - PostgreSQL - 获取每个 GROUP BY 组中列的最大值的行

mysql - MAX与Count相减

php - PHP如何从MySQL中选取一定时间范围内的记录?

php - 有没有办法通过 Pentaho 将任何新的 MySQL 表自动复制到 HANA DB?

php - mysql 查询中的阿拉伯值被数据库忽略

java - Spring MVC 3.0 从 Sql 查询中获取值

php - Laravel,多个 belongsto 和自动插入 ID?