我在网站上有一个评论部分,如果可能的话我想简化一下,这对数据库的影响不大。当用户选择一个帖子,并且如果它有与之关联的评论时,它会列出评论。当评论列表时,它从另一个表中获取用户名。我将用户的id存储在comments表中,并使用该id从users表中选择记录。并显示为“用户”说:
假设我对一篇帖子有1000条评论,它会点击用户表1000次以获取用户名。我认为这可能是一个糟糕的设计。我想到了一些解决方案,但不知道在这种情况下会推荐什么。
我应该只是将用户名存储在评论表中吗?
我应该存储已在会话数组中调用的所有用户名吗?
将所有用户名放在一个文件中,并从文件中调用?
还是有其他我没有想过的解决方案吗?
我有点困惑。我认为通过使用注释表中的ID,然后使用它来获取用户名,我做了正确的事情,但在阅读了大约一百万个帖子后,对数据库的影响较小,我开始质疑自己。哇,谢谢你所有有用的答案。这是表格方案,我不知道为什么我原来没有投入。
笑话评论表:
id | author_id | joke_id | date_created | body
---+-----------+---------+--------------+-----
1 | 3 | 2 | 2011-06-12 | this is a comment
和用户:
id | user_name | password | email | date_joined | visible
---+-----------+----------+-------+-------------+---------
3 | booboo | password | email | todays_date | 1
答案 0 :(得分:3)
这是JOIN
的用途 - 这样您就可以运行单个查询并有效地从多个表中获取组合信息。 E.g:
SELECT comments.id, comments.content, users.name
FROM comments
JOIN users ON comments.user = users.id
WHERE comments.id in (1,2,3)
会查找ID为1,2和3的3条评论,并且还会获取每个评论者的用户名,并返回如下所示的行:
comments.id | comments.content | users.name
------------+-------------------+---------
1 | "First comment." | "Poster1"
2 | "Second comment." | "Poster2"
3 | "Third comment." | "Poster3"
答案 1 :(得分:3)
听起来你的评论表中有一个userID字段,但是需要查找用户名,对吗?如果是这样,JOIN将是最好的解决方案。
类似的东西:
SELECT *
FROM `comments`
LEFT JOIN `users` ON `users`.`id` = `comments`.`userid`
WHERE `postid`='1'
要阅读有关联接及其无限可能性的更多信息,请阅读here
答案 2 :(得分:0)
SELECT * FROM comments LEFT JOIN users ON comments.posterid = users.id
Google for LEFT JOIN获取更多信息:)
答案 3 :(得分:-1)
您是否允许多次使用相同的用户名?如果没有,那么我会使用username
字段作为users
表的PK,并将其作为FK存储在comments
表中。这将很好地解决你的问题。
如果更改users
表的PK太大问题,那么只需将用户名存储在comments
部分,因为您仍然可以使用该选项从{{1}中选择一条记录表格。