【问题标题】:Id handling / inserting in multiple tables. (basic forum)在多个表中处理/插入 ID。 (基础论坛)
【发布时间】:2012-02-27 07:38:58
【问题描述】:

所以我开始写一个论坛,因为我想学一点SQL(MySQL)。

首先,我有一个 posts 表,并且有一个 post_idtopic_id 列。

但是,另一方面,我有一个 topics 表。 在 topics 表中,我也有一个 last_post_idtopic_id

所以它们是相互引用的。

那么问题来了:当用户创建主题(同时写第一篇文章)时,如何有效地插入这些id??

因为现在我必须执行以下步骤:

  1. 插入主题相关数据(主题标题..等,插入last_post_id =0 因为我不知道这里的值),然后检索topic_id

  2. 插入帖子数据(文本、用户名..、topic_id),并检索这个特定的post_id

  3. 更新 topics表,使用检索到的post_id(设置last_post_id)。

是不是太冗长、乏味、无效..?

感谢您的宝贵时间。我的英语不是最好的.. sry.

【问题讨论】:

  • 您可以使用单个事务来完成,但基本思想是相同的。您需要在拥有topic_id 之前插入新主题,并且您需要在拥有last_post_id 之前插入新帖子。使用您当前的表格,没有办法解决这个问题。 *编辑添加:您还可以使用TRIGGER,当新记录添加到posts 时自动更新last_post_id 字段。这不会改变执行的查询数量,但它会由 MySQL 本身透明地处理。
  • @MartinodF:你想把它写下来作为答案吗?当您发表评论时,我正在写几乎相同的东西(甚至是触发器!)。
  • @muistooshort 我已经把它作为答案发布了,也许有点晚了:) 你关于使用 NULL 的观点也是一个好主意!

标签: php mysql sql


【解决方案1】:

您可以使用单个事务来完成,但基本思想是相同的。您需要在拥有topic_id 之前插入新主题,并且您需要在拥有last_post_id 之前插入新帖子。使用您当前的表,没有办法解决这个问题。

您还可以使用TRIGGER,在将新记录添加到posts 时自动更新last_post_id 字段。这不会改变执行的查询数量,但它会由 MySQL 本身透明地处理。

另外,mu 提出的观点太短了,他的回答是将last_post_id 设置为NULL 是个好主意。

【讨论】:

  • 我只是把这个留给你,因为我们说的是同样的事情,而你确实是第一个进来的。
  • 亩,你为什么删除? :)) 我刚刚开始阅读那个外键的东西.. 我不能在你的操作选项卡下找到已删除的帖子吗? -- @MartinodF 谢谢:)
  • 谢谢@muistooshort,你真好! @CriticalPoint 关于外键,如果你使用 InnoDB,你应该确保 topics.last_post_id 被声明为引用 post.post_id 的外键,并且 post.topic_id 引用 topics.topic_id。您可以定义当这些关系被 UPDATE 或 DELETE 破坏时要做什么,例如在删除该主题时删除具有特定topic_id 的所有帖子。请务必阅读有关外键的信息!
【解决方案2】:

last_post_id 没有意义,只是额外的工作。相反,您应该在需要时动态获取特定主题的最后一篇文章。没有理由将其存储在数据库中。

关于主题/帖子,正常的过程是,如果主题不存在,则创建主题,获取创建的 id,然后插入具有该主题 ID 的新帖子,就像你说的那样。

【讨论】:

  • 是的,听起来很合理.. 但是 phpBB 在主题表中也有 last_post_id :D -- 正如我看到的数据库结构
  • 这不是没有意义的。它当然没有标准化,但它保存了一个查询(类似于SELECT MAX(id) FROM posts WHERE topic_id = X.)。这是一种权衡,您必须确保您的last_post_id 保持正确更新,但它有存在的理由:)
  • @MartinodF,如果您将 last_post_id 存储在主题表中,您仍然需要查询帖子表以获取用户/帖子/日期或您想要获取的任何内容。如果您改为使用 select user,date from posts where topic_id = $topic_id order_by date desc limit 1 之类的内容查询 post 表,您不会对服务器施加更大的压力,对吗?
  • 您可以使用联接在单个查询中获取该信息。 SELECT topics.*, posts.user, posts.date FROM topics INNER JOIN posts ON topics.last_post_id = posts.post_id WHERE topics.topic_id = X。我并不是说这是一个更好的解决方案,只是它是可行的。在决定解决哪个问题之前,应该评估两者的优缺点:)
  • 我同意你可以使用加入。这听起来不像是好的做法,但它对服务器友好。有没有办法在同一个查询中获取主题和最新帖子,而不存储 latest_id?我猜你必须使用某种 mysql 循环?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多