我有一个博客程序(有点像 Twitter),我目前正在制作一个最近访问过的框,其中包含最近访问过您页面的 9 个人。
每个人都使用不同的用户名注册。
我目前拥有的是这样的数据库:
-----------------------------
| id | username | who_visit |
-----------------------------
例如,如果 9 个用户 foo1
到 foo9
访问了 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/