在具有Like系统(例如Facebook)的网站上,当您查看帖子时,它会说You, John, Jane, Smith, and 4 others liked this post
(Facebook的方法甚至会将名称限制为您的朋友)。我期待设计一个输出该信息的数据库(在我的情况下,不需要朋友列出)。
第一个表是post
表:
post_id
user_id
post_text_raw
post_text_sanitized
like_count
第二个表是likes
表:
post_id
user_id
例如 user
表是:
user_id
user_name
salt
password_hash
当喜欢帖子时,它会迭代like_count
单元格并在likes
表格中插入一行。
我想到了两个解决方案,添加了一些列来将user_id
缓存到帖子表中,例如:
like_user_id
like_user_id2
like_user_id3
只需使用JOIN
匹配相应的用户名。
另一种解决方案是对LEFT JOIN
表使用子查询和likes
,并对users
表使用另一个连接;但是,这种情况下的效率可能会受到关注。
我一直在决定设计这个的最佳方法是什么,我花了最近几个小时寻找解决方案而且我已经空了。
答案 0 :(得分:0)
我想到了两个解决方案, 1添加列到缓存 user_id进入post表,例如:
like_user_id like_user_id2 like_user_id3
没有。没有。一千次没有。不要做这种非规范化,否则你会抱歉。
另一种解决方案是使用子查询和LEFT JOIN来实现 喜欢table,另一个加入users表;
是的,这就是这样的应用程序的方法。
但是,这种情况下的效率可能会受到关注。
不要担心。 SQL是为这种事情而制作的。当您的应用程序扩展时,您可能需要调整索引。但是当你决定第六个人应该能够“喜欢”某些东西时,这比远更容易。
只有当你得到数百万行时才应该考虑任何类型的非规范化。到那时,你将比现在更好地理解你的问题空间。