mysql - 在 MySQL 中存储用户的 "favorites"的最佳方式

标签 mysql

我有一个相册。我想添加“添加到收藏夹”按钮 - 这样用户就可以将其他用户添加到他/她的收藏夹中。然后我希望每个用户都能够看到他最喜欢的用户列表,以及能够看到谁(用户列表)将该用户添加到收藏夹。

我找到了两种方法,第一种是:

faver_id faved_id
1       10
1       31
1       24 
10      1
10      24

我不喜欢这种方法因为 1) 大量重复 2) future 非常大的表(如果一个至少有 1001 个用户,并且每个用户都喜欢其他 1000 个用户 = 1 001 000 条记录)我想这会减慢我的基础。

第二种方式是:

user_id   favs
1          1  23 34 56 87 23
10         45 32 67 54 34 88 101

如果用户喜欢其他用户,我可以在 php 中获取这些收藏夹和 explode() select count(user_id) from users where favs LIKE '% 23 %' and user_id=10;

但我觉得第二种方式在 MySQL 术语中不是很“正确”。

你能给我一些建议吗?

最佳答案

想想这个。您反对使用第一种方法的论点是您的表可能会变得太大,但是您接着说如果您使用第二种方法,您可以运行通配符查询来查找包含 某些内容的字段。

第二种方法强制进行全表搜索,并且不可索引。使用第一种方法,您只需在每个列上添加索引就可以了。第一种方法比第二种方法好很多、很多很多。由于扩展似乎是您唯一关心的第一个问题,我认为答案是显而易见的。

采用第一种方法。多对多表无处不在,这是有充分理由的。

编辑:

另一个问题是,第二种方法将维护数据库的大量工作移交给了应用程序。这在某些情况下很好,但您所谈论的情况是数据库擅长的事情。你只会重新发明轮子,而且很糟糕。

关于mysql - 在 MySQL 中存储用户的 "favorites"的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4415518/

相关文章:

mysql - 如何用一条sql检查多条记录的列值是否相同

mysql - 向依赖于第一列的 SELECT 语句添加子查询?

php - 显示查询结果时遇到一些问题

mysql - 选择表的每一行,除非 id 不是给定外键的最大值

mysql - 使用 InnoDB 引擎导入 sql 转储

php - 根据 laravel 中当前的应用程序区域设置在适当的 Mysql 字段中搜索

php - Opencart错误 map 显示为空和头像

mysql - 是否可以根据特定值自动创建查询?

mysql - 如何为 MySQL 数据库中的所有时间戳/日期时间添加偏移量?

mysql - 用于查找运行总计的两个值之间的差异