我需要保留一个列表,其中包含查看过一段内容的 user_id
,以计算唯一用户查看次数。 user_id
是一个 INT(10)
字段。
我可以创建一个包含 user_id
、content_id
和 viewed
的表,并在每次用户查看内容时添加一行,但这看起来很慢.对于用户查看的每条内容,我都必须查询类似
SELECT COUNT(*) FROM viewed_table WHERE content_id = $content_id;
获取浏览量,然后
SELECT COUNT(*) FROM viewed_table WHERE user_id = $user_id AND content_id = $content_id;
查看用户是否看过该内容,如果没有则插入一行。 (每次用户查看某物时都会有 2 或 3 个额外的查询)。
或者...
我是否应该在我的内容表和 unserialize()
/serialize()
数组中添加一个 viewed
字段,每次我添加一个 用户ID
? json_encode()
是另一个类似的选项,它在大型数据集上似乎更快。
对于不断发展的网站,哪个选项最快/最具扩展性?感谢您的帮助!
最佳答案
经验法则:一般序列化关系数据,特别是外键 == 通往 hell 的高速公路。
有一个表,您可以在其中存储所有 View 的总和,并且您只能增加/减少它。这应该比 SELECT COUNT(*) FROM viewed_table WHERE content_id = $content_id;
查看给定用户是否已经查看给定页面SELECT 1 FROM viewed_table WHERE user_id = $user_id AND content_id = $content_id LIMIT 1;
。这将返回 0 行或 1 行,因此您只需检查一下。
关于mysql - 有效地存储一堆外键(序列化与新表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901422/