これを処理するにはいくつかの方法があります。 1つはコンテンツにstatus
フラグを設定することです。これは単純なサイトに便利です。もう1つは、コンテンツをどこに、どのように、いつ表示するべきかを接続するジョイン・テーブルを持つことです。
単純なサイトの場合は、コンテンツテーブルにstatus
フラグを追加するだけです。
create type statuses as enum ('published', 'draft');
create table posts (
id serial,
author integer references people(id),
content text not null,
...whatever other data...
status statuses default 'draft'
);
私はタイプミスが(重要)キャッチされますので、収納スペースを(それほど重要ではない)を低減するPostgreSQL enumerated typeを使用し、そのすべての可能な状況があるのではなく自分が追加されているかを確認するための場所がありますしましたウィリー・ニリー(また重要)。
次に、公開されている投稿をすべて選択することができます。
select *
from posts
where author = ? and
status = 'published'
これは非常に簡単ですが、ディスプレイとコンテンツは一緒に使用されます。 status
フラグをチェックするのを忘れた場合、投稿の下書きが表示されます。
status
フラグのバリエーションは、「公開日」を持つことです。この前は表示されません。この時間が過ぎると、それが行われます。
create table posts (
id serial,
author integer references people(id),
content text not null,
...whatever other data...
publish_at datetime default '9999-12-31'
);
次に、あなたはpublish_at
が現在の日時よりも小さい場合、それは見て表示するかどうかを確認することができます。
デフォルトで '9999-12-31'に設定すると、デフォルトですべての投稿が公開されなくなります。これは公開/草案と、余分なコードを実行することなく自動的に投稿を公開する機能とを組み合わせたものです。
もっと堅牢なソリューションは、公開するものとその場所の結合テーブルを用意することです。同じposts
テーブルから開始しますが、status
カラムは使用しないでください。
create table posts (
id serial,
author integer references people(id),
content text not null,
...whatever other data...
);
人のブログには1つ以上あります。
次に、ブログ記事と投稿をつなぐ結合テーブルを作成します。何かが「公表」される今
create table blog_posts (
blog integer references blogs(id),
post integer references posts(id),
posted datetime not null default current_timestamp
);
は、それはblog_posts
に挿入されています。ステータスフラグはありません。あなたは、ユーザーのブログ記事を参照したい場合は...
select *
from blog_posts
join blogs on blogs.id = blog_posts.blog
where blogs.curator = ?
order by posted desc;
ここでの利点は、1つのポストがよりblog_postsテーブルにテーブルまたは複数のフィールドを追加することによって、参加する複数の場所に現れることがあります。そして、すべてのステートメントに含めることを覚えておくフィールドは、status
です。どちらかが結合テーブルにあるか、結合テーブルにありません。
blog_posts
は、publish_at
フィールドを持つこともできます。
あなたの最後のコメントで自分に答え。他の州があるかどうか考えてください(進行中ですか?承認待ちですか?) –
なぜブログテーブルがありますか?あなたはいくつかのブログを持っている場合は、ブログテーブルが必要です...しかし、あなたはそれを持っている場合は、取り除く... – barudo