mysql - 有效地存储一堆外键(序列化与新表)

标签 mysql sql

我需要保留一个列表,其中包含查看过一段内容的 user_id,以计算唯一用户查看次数。 user_id 是一个 INT(10) 字段。

我可以创建一个包含 user_idcontent_idviewed 的表,并在每次用户查看内容时添加一行,但这看起来很慢.对于用户查看的每条内容,我都必须查询类似

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 字段,每次我添加一个 用户IDjson_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/

相关文章:

mysql - 加入职位

使用 MysqlDb 时出现 Python 错误 - sets 模块已弃用

mysql - 计算多列

mysql - 尝试将现有生产数据库表列从枚举转换为 VARCHAR

sql - 如何设计映射同一实体的表?

sql - 如何在 SQL 中查找作为子字符串的 int 值的 MIN 和 MAX?

Mysql - 获取不同的记录

mysql - 要向这些数据模型添加什么类型的关系?

mysql - 如何在 "SQL Transactions"中实现 "Clean Architecture"?

java - 插入数据库AsyncTask错误