如何使用发布/草稿表设计sql数据库?

如何使用发布/草稿表设计sql数据库?,sql,database,postgresql,database-schema,publish,Sql,Database,Postgresql,Database Schema,Publish,我想知道如何做一个博客数据库的方案。作者撰写文章并在博客上发表。这是非常简单的表格,如 作者、文章、博客 但该条款也可以有草案。读者看不到草稿,当文章发表时,博客的读者也可以看到草稿。已发布的文章可以取消发布,并成为草稿 如何连接 草稿 及 发表 包含文章和博客表的表?有必要吗?或者只是在Article表中添加一些列?比如我发布了什么?有几种方法可以解决这个问题。一个是在你的内容上有一个状态标志,这对简单的网站很有用。另一个是有一个连接表,将内容连接到应该显示的位置、方式和时间 对于简单的站点,

我想知道如何做一个博客数据库的方案。作者撰写文章并在博客上发表。这是非常简单的表格,如

作者、文章、博客

但该条款也可以有草案。读者看不到草稿,当文章发表时,博客的读者也可以看到草稿。已发布的文章可以取消发布,并成为草稿

如何连接

草稿

发表


包含文章和博客表的表?有必要吗?或者只是在Article表中添加一些列?比如我发布了什么?

有几种方法可以解决这个问题。一个是在你的内容上有一个状态标志,这对简单的网站很有用。另一个是有一个连接表,将内容连接到应该显示的位置、方式和时间

对于简单的站点,您只需在内容表中添加一个状态标志

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'
);
我已经使用了一个用于减少存储空间的方法,它不太重要,因此拼写错误会被发现很重要,因此有一个地方可以查看所有可能的状态是什么,而不是随意添加它们也很重要

然后你可以选择所有发布的帖子

select *
from posts
where author = ? and
      status = 'published'
这很简单,但是显示和内容是结合在一起的。如果您忘记检查状态标志,您将显示草稿帖子

状态标志的一个变体是在日期发布。在此之前,它不会显示。过了这段时间,它就会

create table posts (
    id serial,
    author integer references people(id),
    content text not null,
    ...whatever other data...
    publish_at datetime default '9999-12-31'
);
然后,您可以通过查看发布时间是否小于当前日期时间来检查是否应显示它

select *
from posts
where author = ? and
      publish_at < current_timestamp
而不是一个人的博客

create table blogs (
    id serial,
    curator integer references people(id)
);
然后创建一个连接日志和博客日志的连接表

create table blog_posts (
    blog integer references blogs(id),
    post integer references posts(id),
    posted datetime not null default current_timestamp
);
现在,当发布某个内容时,它会被插入到博客文章中。没有状态标志。如果您想查看用户的博客帖子

select *
from blog_posts
join blogs on blogs.id = blog_posts.blog
where blogs.curator = ?
order by posted desc;
这里的优点是,通过向blog_posts表添加更多的联接表或字段,一篇文章可以出现在多个位置。并且没有任何状态字段要记住包含在每个语句中。它要么在联接表中,要么不在联接表中


博客帖子还可以在“发布位置”字段中添加内容。

使用以下内容将其可视化:

在表中:

基本上所有关于作者的信息

在条款表上:

每篇文章通常有一位作者。。。嗯,但它可能有不止一个,但这样就可以了。因此,外键作者的身份证

对于已发布和草稿:

“已发布”和“草稿”位于“状态”字段中。在本例中,枚举为“已发布”、“草稿”。在你的网站上发布?我不反对带有布尔值的db设计,比如yes/no、true/false,但如果将其作为枚举,则会更清楚。可能以后你会在那里添加另一个状态,你的isPublished不再相关。一种情况可能是:您稍后需要一个状态,该状态显示为:计划发布或计划取消发布或任何其他状态

关于blog表:

如果你只有一个博客,你不一定需要它。但是如果你有几个博客,那么你就需要这个表

对于上面的sql:

CREATE TABLE IF NOT EXISTS `authors` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(200) NULL,
  `status` ENUM('active', 'inactive') NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `articles` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(60) NULL,
  `content` TEXT NULL,
  `status` ENUM('published', 'draft') NULL,
  `datetime` INT NULL,
  `authors_id` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_articles_authors_idx` (`authors_id` ASC),
  CONSTRAINT `fk_articles_authors`
    FOREIGN KEY (`authors_id`)
    REFERENCES `authors` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
 ENGINE = InnoDB

你在最后的评论中回答了你自己。还想一想是否还有其他州在进行中?等待批准?为什么会有博客表?如果你有几个博客,那么博客表是必要的。。。但是如果你只有一个,那就把它扔掉。。。
CREATE TABLE IF NOT EXISTS `authors` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(200) NULL,
  `status` ENUM('active', 'inactive') NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `articles` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(60) NULL,
  `content` TEXT NULL,
  `status` ENUM('published', 'draft') NULL,
  `datetime` INT NULL,
  `authors_id` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_articles_authors_idx` (`authors_id` ASC),
  CONSTRAINT `fk_articles_authors`
    FOREIGN KEY (`authors_id`)
    REFERENCES `authors` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
 ENGINE = InnoDB