読者に読んだ旨を伝える掲示板のようなものを作っているのですが、もっと効率的な方法はないかと考えていました。
MySQL 側に 3 つのテーブルがあります。
+-----------------+ +-----------------+ +-----------------+
| Announcements | | Acknowledgement | | User |
+-----------------+ +-----------------+ +-----------------+
| announce_id | | ack_id | | user_id |
| announce_msg | | announce_id | | user_name |
| ... | | user_id | | ... |
+-----------------+ +-----------------+ +-----------------+
ユーザーが (ボタンをクリックして) アナウンスを「読む」Acknowledgment
と、アナウンス ID とユーザー ID を含むテーブルが挿入されます。2 番目のユーザーが同じアナウンスを「読む」と、Acknowledgement
テーブルは同じアナウンス ID と 2 番目のユーザー 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 エントリが含まれます。承認テーブルが非常に長くなるようです。時間が経つと問題になるのでしょうか?
これは私がやろうとしていることの非常に大まかな例ですが、これをすべて書くのに長い時間がかかりました. 詳細が必要な場合はお知らせください。