MySQL在留言板中 - 检索消息和所有相关信息

时间:2016-01-15 17:55:32

标签: mysql

我对Web开发(HTML,PHP,MySQL等)很陌生,并认为开发一个非常简单的留言板作为练习可能是个好主意。

我已经建立了一个数据库来存储我需要的一切。表格如下:

  • 受试者

    • id(Int(4),PK)
    • title(VARCHAR(50))
    • creatorID(Int(4))
    • creationTime(datetime)
  • 消息

    • id(Int(6),PK)
    • subjectID(Int(4))
    • authorID(Int(4),FK)
    • postTime(datetime)
  • 用户

    • id(Int(6),PK)
    • 用户名(Varchar(10))
    • 密码(Char(32))
    • 电子邮件(Varchar(50))
    • signupdate(datetime)

这只是一个基本结构;字段的数据类型可能远非最佳。

我现在正处于试图显示给定主题中的所有消息的位置。我这样做是让我的showthread.php通过$_GET['subjectID']捕获主题ID。 我显然需要从db中获取所有相关信息,即作者的usernamepostTime等。 起初我通过以下方式解决了这个问题:

1。)获取所有带有subjectID的消息(一个查询) 2.)对于每条消息,获取用户信息 3.)通过COUNT(*)

获取用户的帖子数

然后我想也许我可以在一个查询中完成所有这些 - 事后我应该在users表中定义一个帖子计数列,但是为了训练我继续没有该列。所以我继续创建了以下两个查询:

1)

SELECT message, postTime, username, signupdate, postcount FROM messages as m
INNER JOIN users AS u ON m.authorID = u.id
INNER JOIN (
SELECT COUNT(*) AS postcount, u.id FROM messages AS m INNER JOIN users AS u ON m.authorID = u.id
GROUP BY u.id
) AS c ON c.id = m.authorID WHERE m.subjectID = $subjectID ORDER BY m.ID ASC

2)

SELECT message, postTime, (
SELECT username FROM users WHERE users.id = om.authorID
) AS username, (
SELECT COUNT(*) FROM messages As im WHERE im.authorID = om.authorID
) AS posts
FROM messages As om WHERE subjectID = $subjectID ORDER BY om.id ASC;

如前所述,他们现在都在做这项工作。 我认为,一旦我的数据库变得足够大,第一个版本的执行效果会非常差,因为内部子查询总是查询所有用户的帖子数,无论他们是否发布了相关主题。 所以我想我的问题是这样的:查询数字2)对于不可忽略大小的数据库是否合理?如果没有,我可以使用哪些不同类型的查询?我感到有点不知所措,你可以解决SQL问题的角度,我担心我可能会遗漏一些东西。 也许性能甚至不是任何上述查询的问题,因为现在的MySQL实现足够智能? : - )

我很感激有关该主题的任何意见。请记住,我正在尝试解决此问题而不在我的users表中引入额外的帖子计数字段。感谢。

1 个答案:

答案 0 :(得分:1)

如果您担心性能问题,当您的查询持续数分钟时,最好创建一个视图或物化视图。

视图是使用查询构建的表。这意味着您可以创建一个视图,检索您提到的问题的所有必要数据(带来所有用户活动(帖子,消息等)并将其放在1个表中。这样,当您检索数据时,可以节省连接表的时间。

http://dev.mysql.com/doc/refman/5.7/en/create-view.html

中的更多信息

实体化视图是常规表,它们完成视图的相同工作,您需要运行具有某些频率的cronjob来更新信息。

使用或两者取决于执行不同类型的CRUD操作的频率。您也可以使用索引来加速数据检索,但是在包含大量插入或删除的表中并不是一个好主意,因为这些操作会变慢。