我正在制作一个类似于公告板的东西,它要求读者承认他们已经阅读了它,并且想知道是否有更有效的方法来做到这一点。
我在 MySQL 端有 3 个表:
+-----------------+ +-----------------+ +-----------------+
| Announcements | | Acknowledgement | | User |
+-----------------+ +-----------------+ +-----------------+
| announce_id | | ack_id | | user_id |
| announce_msg | | announce_id | | user_name |
| ... | | user_id | | ... |
+-----------------+ +-----------------+ +-----------------+
当用户“阅读”公告(通过单击按钮)时,Acknowledgment
将插入带有公告 ID 和用户 ID 的表格。当第二个用户“阅读”相同的公告时,Acknowledgement
将再次插入具有相同公告 ID 和第二个用户 ID 的表,依此类推......
+--------------------------------+
| Acknowledgement |
+--------+-------------+---------+
| ack_id | announce_id | user_id |
+--------+-------------+---------+
| 1 | 1 | 1 |
| 2 | 1 | 4 |
| 3 | 1 | 3 |
| 4 | 3 | 1 |
| 5 | 3 | 6 |
| 6 | 3 | 2 |
+--------+-------------+---------+
现在来解决问题。在前端,当我在一个页面上列出所有公告时,我必须首先查询所有公告。然后,对于每个公告,我都必须对所有阅读过此公告的用户进行另一次查询。
$sql = "select * from Announcements";
$result = $pdo->query($sql);
while ($row = $result->fetch())
{
$announce_id = $row['announce_id'];
$announce_msg = $row['annouce_msg'];
$readers = "";
$sql2 = "select u.user_name from Acknowledgement as a INNER JOIN User as u where announcement_id =".$annouce_id;
$result2 = $pdo->query($sql);
while ($row2 = $result2->fetch())
{
$readers .= $row2['user_name'].", ";
}
echo "id:".$annouce_id.", message:".$announce_msg.", Readers:".$readers;
}
所以如果页面上有10条公告,那么每条公告就会有10个子查询。我现在所拥有的现在可以完成这项工作......但是如果有 1000 个公告怎么办?那么会有1000个子查询呢?听起来数据库真的会受到重创。所以我希望有更好的方法来做到这一点。
此外,如果用户表中的 1000 人阅读了所有 1000 条公告,则确认表将有 1000x1000 个条目。看起来确认表会变得非常长。随着时间的推移,这会成为问题吗?
这是我正在尝试做的一个非常粗略的例子,但我确实花了很长时间来写这一切。如果需要更多详细信息,请告诉我。