2016-11-15 108 views
1

我想知道如何製作一個博客數據庫的方案。作者寫文章,並在博客上發佈。這是一個像如何使用發佈/草稿表設計sql數據庫?

作者,文章,博客

但文章也可以有一個草案的表很簡單。草稿不能被讀者看到,當文章發表時,博客的讀者可以看到草稿。發表的文章可以不發表,並且可以成爲草稿。

如何連接

草案

發佈

表與文章和博客表?有必要嗎?或者,也許只是添加一些列到文章表?像IsPublished還是什麼?

+1

你回答自己在最後的評論。還有一個想法,如果有任何其他國家(正在進行?等待批准?) –

+0

爲什麼有一個博客表?如果你有幾個博客,那麼博客表是必要的...但是如果你只有一個博客,那麼擺脫... – barudo

回答

1

有幾種方法可以解決這個問題。一種是在你的內容上有一個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 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... 
); 

比有一個人的博客。

​​

然後創建一個連接表與博客文章連接帖子。

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字段。

0

它想象用這樣的:

enter image description here

在 「作者」 表:

基本上所有關於作者

在 「公司章程」 表中的信息:

每篇文章將有一個作者(通常...嗯,但它可以有多個可能但這會做)。所以外鍵authors_id。

對於發佈和草案:

「發佈」 和 「草案」 在狀態欄中。在這種情況下是enum('published','draft')。在你的發佈?我沒有任何反對數據庫設計與布爾值(即是/否,真/假),但它會更清楚,如果你有它作爲一個枚舉。也許稍後你會添加另一個狀態,你的已發佈不再相關。一種情況可能是:您稍後需要一種狀態:「計劃發佈」或說「計劃取消發佈」或任何其他狀態。

至於「博客」表:

你不一定需要,如果你只有一個博客。但是如果你有多個博客,那麼你需要這張桌子。

爲上述的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