[英]How to design a sql database with a publish/draft table?
我想知道如何制定博客數據庫方案。 作者撰寫文章,然后將其發布在博客上。 像這樣的表這很簡單
作者,文章,博客
但是文章也可以有草稿。 讀者看不到草稿,而文章發表后博客的讀者也可以看到草稿。 已發表的文章可以不發表,而是成為草稿。
如何連接
草案
和
發布
文章表和博客表的表格? 有必要嗎? 還是只是向“文章”表添加一些列? 像IsPublished之類的?
有幾種方法可以解決此問題。 一種是在您的內容上帶有status
標志,這對於簡單的網站很有用。 另一種方法是具有一個聯接表,該表將內容連接到應在何處,如何顯示以及何時顯示。
對於簡單的網站,您只需在status
表中添加一個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枚舉類型來減少存儲空間(不是那么重要),因此會捕獲錯字(重要),因此有一個地方可以查看所有可能的狀態,而不是隨意添加它們(很重要) )。
然后,您可以選擇所有已發布的帖子。
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
是否小於當前日期時間來檢查是否應顯示它。
select *
from posts
where author = ? and
publish_at < current_timestamp
默認情況下,默認為“ 9999-12-31”,所有帖子均不發布。 這將發布/草稿與自動發布帖子的能力結合在一起,而無需運行任何額外的代碼。
一個更可靠的解決方案是為要發布的內容和發布位置提供一個聯接表。 從相同的posts
表開始,但沒有status
列。
create table posts (
id serial,
author integer references people(id),
content text not null,
...whatever other data...
);
比一個人的博客要多。
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
);
現在,當“發布”某些東西時,它會插入到blog_posts
。 沒有狀態標志。 如果您想查看用戶的博客文章...
select *
from blog_posts
join blogs on blogs.id = blog_posts.blog
where blogs.curator = ?
order by posted desc;
這樣做的好處是,通過向blog_posts表添加更多聯接表或更多字段,可以在多個位置顯示一個帖子。 而且沒有一個status
字段要記住要包含在每個語句中。 它在連接表中還是不在連接表中。
blog_posts
也可以具有publish_at
字段。
使用以下命令對其進行可視化:
在“作者”表上:
基本上所有關於作者的信息
在“文章”表上:
每篇文章都會有一位作者(通常是……嗯,但可能有多個作者,但這確實可以)。 因此,外鍵authors_id。
對於已發布和草稿:
“已發布”和“草稿”位於狀態字段中。 在這種情況下為enum('published','draft')。 在您的isPublished上? 我對帶有布爾值(即是/否,是/否)的數據庫設計沒有任何要求,但是如果將其作為枚舉,它將更加清楚。 大概以后,您將在其中添加另一個狀態,並且isPublished不再相關。 一個例子可能是:您稍后需要一個狀態:“預定發布”或“預定未發布”或其他任何狀態。
關於“博客”表:
如果只有一個博客,則不一定需要。 但是,如果您有多個博客,則需要該表。
至於上面的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.