我有一个照片库。我想添加“添加到收藏夹”按钮 - 因此用户可以将其他用户添加到他/她的收藏夹中。然后我希望每个用户都能够观看他喜欢的用户列表,以及能够看到谁(用户列表)将此用户添加到收藏夹。
我发现了两种方式,第一种方式是:
faver_id faved_id
1 10
1 31
1 24
10 1
10 24
我不喜欢这种方法因为 1)将来会有很多重复的2)非常大的表(如果有至少1001个用户,每个人都喜欢其他1000个用户= 1 001 000条记录),我认为这会减慢我的基础。
第二种方式是:
user_id favs
1 1 23 34 56 87 23
10 45 32 67 54 34 88 101
如果用户喜欢其他用户通过MySQL查询select count(user_id) from users where favs LIKE '% 23 %' and user_id=10;
但我觉得第二种方式在MySQL术语中并不是非常“正确”。
你能告诉我什么吗?
答案 0 :(得分:13)
想一想。你反对使用第一种方法的论点是你的表可能会变得太大,但你继续说,如果你使用第二种方法,你可以运行通配符查询来查找包含某些东西的字段。
第二种方法强制进行全表搜索,并且无法索引。使用第一种方法,您只需在每个列上打上索引,就可以了。第一种方法比第二种方法更好地扩展,更多,更多。由于缩放似乎是你唯一关注的问题,我认为答案是显而易见的。
采用第一种方法。在任何地方都使用了多对多表,这是有充分理由的。
编辑:
另一个问题是第二种方法是将许多工作交给应用程序维护数据库。在某些情况下这很好,但您所谈论的案例是数据库擅长的事情。你只会重新发明轮子,而且非常糟糕。
答案 1 :(得分:1)
嗯,当您想要删除或进行更改时,第二种方式并不那么容易,但就MySQL而言它是正确的。
但是,Joomla甚至在同一个字段params
中包含了不同的信息日期。
答案 2 :(得分:1)
绝对是第一种方式。