Il y a plusieurs façons de gérer cela. L'un est d'avoir un drapeau status
sur votre contenu, ce qui est utile pour les sites simples. L'autre est d'avoir une table de jointure reliant le contenu à où, comment, et quand il devrait être affiché.
Pour les sites simples, vous pouvez ajouter un drapeau status
à vos tableaux de contenu.
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'
);
Je l'ai utilisé un PostgreSQL enumerated type pour réduire l'espace de stockage (pas si important), donc les fautes de frappe seront pris (important), et donc il y a un endroit pour voir ce que tous les statuts possibles sont plutôt que de leur être ajoutés Willy nilly (aussi important).
Ensuite, vous pouvez simplement sélectionner tous les articles qui sont publiés.
select *
from posts
where author = ? and
status = 'published'
Ceci est très simple, mais l'affichage et le contenu sont utilisés ensemble. Et si vous oubliez de vérifier le drapeau status
, vous verrez les brouillons.
Une variation sur le drapeau status
est d'avoir une date "à publier". Avant cette heure, il ne sera pas affiché. Après ce temps, il le fera.
create table posts (
id serial,
author integer references people(id),
content text not null,
...whatever other data...
publish_at datetime default '9999-12-31'
);
Ensuite, vous pouvez vérifier si elle doit être affichée ou non en voyant si publish_at
est inférieure à la datetime actuelle. Par défaut à '9999-12-31', tous les messages ne sont pas publiés. Par défaut, tous les messages sont non publiés. Cela combine publication/brouillon avec la possibilité de publier automatiquement un article sans avoir à exécuter de code supplémentaire.
Une solution plus robuste consiste à avoir une table de jointure pour ce qui doit être publié et où.Commencez par la même table posts
, mais pas la colonne status
.
create table posts (
id serial,
author integer references people(id),
content text not null,
...whatever other data...
);
Avoir un pour le blog d'une personne. Ensuite, créez une table de jointure reliant les publications à un article de blog.
create table blog_posts (
blog integer references blogs(id),
post integer references posts(id),
posted datetime not null default current_timestamp
);
Maintenant, quand quelque chose est « publié » c'est inséré dans blog_posts
. Il n'y a pas de drapeau d'état. Si vous voulez voir un messages de blog de l'utilisateur ...
select *
from blog_posts
join blogs on blogs.id = blog_posts.blog
where blogs.curator = ?
order by posted desc;
L'avantage est ici un poste peut apparaître à plusieurs endroits en ajoutant plus de tables de jointure ou plusieurs champs à la table blog_posts. Et il n'y a pas de champ status
à ne pas oublier d'inclure dans chaque déclaration. Soit c'est dans la table de jointure ou ce n'est pas le cas.
blog_posts
peut également présenter un champ publish_at
.
vous Votre réponse dans le dernier commentaire. Pensez aussi s'il y a d'autres états (En cours? En attente d'approbation?) –
pourquoi il y a une table de blog? Si vous avez plusieurs blogs, alors la table de blog est nécessaire ... mais si vous n'en avez qu'un alors, débarrassez-vous de ça ... – barudo