SQLite と Perl Dancer フレームワークを使用して、練習用にさらに別のブログ エンジンを作成しています。
テーブルは次のようになります。
CREATE TABLE posts (
p_id INTEGER PRIMARY KEY,
p_url VARCHAR(255),
p_title VARCHAR(255),
p_text TEXT,
p_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE tags (
t_id INTEGER PRIMARY KEY,
t_tag VARCHAR(255),
t_url VARCHAR(255)
);
CREATE TABLE tags_posts_junction (
tp_tag INTEGER NOT NULL,
tp_post INTEGER NOT NULL,
FOREIGN KEY(tp_tag) REFERENCES tags.t_id,
FOREIGN KEY(tp_post) REFERENCES tags.p_id
);
Wordpress (または stackoverflow) などの大物はすべて、各質問の後にメイン ページにタグを表示できます。私もそれを実装したいと考えています。問題は、どうやってそれを行うかです。
これまでのところ、投稿はデータベースに保存されており、最新の 20 件の投稿を表示するページをレンダリングする必要がある場合は、ハッシュ参照 ( fetchall_hashref
from DBI
) をテンプレートに渡します。では、そこにタグを追加するにはどうすればよいですか? もちろん、私は次のようなことができます
my $dbh = database->prepare('SELECT * FROM posts ORDER BY p_date DESC
LIMIT 20 OFFSET 0');
$dbh->execute;
my $posts = $dbh->fetchall_hashref('p_date');
foreach my $key (keys $post) {
my $dbh = database->prepare('SELECT * FROM tags WHERE t_id IN (
SELECT tp_tag FROM tags_posts_junction WHERE tp_post = ?)');
$dbh->execute($post->{"$key"}->{"p_id"});
my $tags = $dbh->fetchall_hashref(t_id);
$post->{"$key"}->{"$tag_hash"} = $tags;
};
しかし、それは醜く、1 ページあたり 20 個のクエリが増えます。多すぎませんか? もっと良い方法があるべきだと思います。
問題は、20 件の投稿のタグを冗長性が最も少ない方法で取得するにはどうすればよいかということです。