根據(jù)前面的構(gòu)思信息,結(jié)合思維導(dǎo)圖、設(shè)計稿,我們就可以設(shè)計數(shù)據(jù)庫了:
我們需要創(chuàng)建5張表,分別是:文章表(articles)、文章內(nèi)容表(article_data)、文章分類表(categories)、文章圖片表(attachments)、博客管理員表(admins)。
接著給每張表設(shè)計需要的字段:

我的博客導(dǎo)圖
文章表articles表結(jié)構(gòu):
CREATE TABLE `articles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(250) NOT NULL DEFAULT '',
`keywords` varchar(250) NOT NULL DEFAULT '',
`description` varchar(250) NOT NULL DEFAULT '',
`category_id` int(10) unsigned NOT NULL DEFAULT 0,
`views` int(10) unsigned NOT NULL DEFAULT 0,
`status` tinyint(1) unsigned NOT NULL DEFAULT 0,
`created_time` int(11) NOT NULL DEFAULT 0,
`updated_time` int(11) NOT NULL DEFAULT 0,
`deleted_time` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_updated_time` (`updated_time`),
KEY `idx_category_id` (`category_id`),
KEY `idx_views` (`views`),
KEY `idx_status` (`status`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
設(shè)計的文章表用來存儲博客文章信息,有9個字段,分別對應(yīng)字段的中文意思。
- id為文章的自增id
- title為文章的標題
- keywords為文章的關(guān)鍵詞
- description為文章的簡介
- category_id為文章與分類關(guān)聯(lián)的分類id
- views為文章的瀏覽量計數(shù)
- status為文章的顯示狀態(tài),值為1的時候表示正常顯示,值為0的是,表示是草稿,不在前臺顯示,值為99的時候,表示這篇文章已刪除,不在前臺顯示,留存是為了以后查驗
- created_time表示文章發(fā)布時間,存的是時間戳
- deleted_time表示文章的刪除時間,記錄這篇文章是什么時候刪除的存的同樣是時間戳
文章內(nèi)容表article_data表結(jié)構(gòu)
CREATE TABLE `article_data` (
`article_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`content` longtext DEFAULT NULL,
PRIMARY KEY (`article_id`),
CONSTRAINT `fk_articles_article_data` FOREIGN KEY (`article_id`) REFERENCES `articles` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
設(shè)計文章表和文章內(nèi)容表分開來存放,主要是因為文章內(nèi)容字段往往會有很多內(nèi)容,而大內(nèi)容在mysql搜索中,會拖慢搜索時間,往往內(nèi)容在列表顯示的時候,并不需要展示出來,所以分開存放可以讓文章列表展示的時候,不需要讀取文章內(nèi)容,提高展示時間,減少內(nèi)存消耗。分開存放也不影響具體文章展示效果。
文章內(nèi)容表比較簡單,它只有2個字段
- article_id 為文章id,關(guān)聯(lián)文章表的id
- content 為文章內(nèi)容,采用longtext格式存儲,可以存儲40億字節(jié)的數(shù)據(jù),不用擔(dān)心文章寫長一點就無法保存的問題。
文章分類表categories表結(jié)構(gòu)
CREATE TABLE `categories` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(250) NOT NULL DEFAULT '',
`description` varchar(250) NOT NULL DEFAULT '',
`content` longtext DEFAULT NULL,
`parent_id` int(10) unsigned NOT NULL DEFAULT 0,
`status` tinyint(1) unsigned NOT NULL DEFAULT 0,
`created_time` int(11) NOT NULL DEFAULT 0,
`updated_time` int(11) NOT NULL DEFAULT 0,
`deleted_time` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_created_time` (`created_time`),
KEY `idx_updated_time` (`updated_time`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
文章分類表用來存儲文章分類,設(shè)置了8個字段,他們分別是:
- id為分類id
- title為分類名稱
- description為分類簡介
- content為分類內(nèi)容
- parent_id為分類的上級分類id
- status為分類的狀態(tài),值為1的時候表示正常顯示,值為0的是,表示是草稿,不在前臺顯示,值為99的時候,表示這個分類已刪除,不在前臺顯示,留存是為了以后查驗
- created_time表示分類的發(fā)布時間,存的是時間戳
- deleted_time表示分類的刪除時間,記錄這個分類是什么時候刪除的存的同樣是時間戳
這里設(shè)計預(yù)留了一些字段,為以后擴展需要需要。分類簡介、分類內(nèi)容、分類上級id可能暫時用不到,后期用到再使用。
文章圖片表attachments表結(jié)構(gòu)
CREATE TABLE `attachments` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`file_name` varchar(100) NOT NULL DEFAULT '',
`file_location` varchar(250) NOT NULL DEFAULT '',
`file_size` bigint(20) unsigned NOT NULL DEFAULT 0,
`file_md5` varchar(32) NOT NULL DEFAULT '',
`width` int(10) unsigned NOT NULL DEFAULT 0,
`height` int(10) unsigned NOT NULL DEFAULT 0,
`status` tinyint(1) unsigned NOT NULL DEFAULT 0,
`created_time` int(11) NOT NULL DEFAULT 0,
`updated_time` int(11) NOT NULL DEFAULT 0,
`deleted_time` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `file_md5` (`file_md5`),
KEY `idx_status` (`status`),
KEY `idx_created_time` (`created_time`),
KEY `idx_updated_time` (`updated_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
文章圖片表用來存儲發(fā)布文章上傳的圖片信息。它有10個字段。
- id為圖片入庫自增id
- file_name為圖片文件名
- file_location為圖片的存儲路徑
- file_size為圖片的大小
- file_md5為圖片的MD5值,用來判斷圖片是否已經(jīng)上傳過,重復(fù)的圖片可以跳過上傳和存儲入庫步驟
- width為圖片的寬度
- height為圖片的高度
- status為圖片的狀態(tài),值為1的時候表示正常顯示,值為0的是,表示是草稿,不在前臺顯示,值為99的時候,表示這篇文章已刪除,不在前臺顯示,留存是為了以后查驗
- created_time表示圖片的發(fā)布時間,存的是時間戳
- deleted_time表示圖片的刪除時間,記錄這個圖片是什么時候刪除的存的同樣是時間戳
博客管理員表admins表結(jié)構(gòu)
CREATE TABLE `admins` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_name` varchar(16) NOT NULL DEFAULT '',
`password` varchar(128) NOT NULL DEFAULT '',
`status` tinyint(1) unsigned NOT NULL DEFAULT 0,
`created_time` int(11) NOT NULL DEFAULT 0,
`updated_time` int(11) NOT NULL DEFAULT 0,
`deleted_time` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_user_name` (`user_name`),
KEY `idx_status` (`status`),
KEY `idx_created_time` (`created_time`),
KEY `idx_updated_time` (`updated_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
博客管理員表用來存儲博客管理員的賬號和密碼。理論上支持多管理員使用。
- id為管理員id
- user_name為管理員名稱
- password為管理員密碼,這個密碼不是明文的,它是一串加密過的字符串,數(shù)據(jù)庫是不保存明文密碼的。驗證密碼的時候,通過將提交的密碼加密,然后對2個加密的密碼做比對來驗證密碼是否正確。
- status為管理員的狀態(tài),值為1的時候表示正常顯示,值為0的時候,表示該用戶已禁用,值為99的時候,已刪除
- created_time表示管理員的添加時間,存的是時間戳
- deleted_time表示管理員的刪除時間,記錄這個管理員是什么時候刪除的存的同樣是時間戳
至此數(shù)據(jù)庫設(shè)計完成了,詳細到每一個字段的意思和作用。我們將上面設(shè)計的數(shù)據(jù)結(jié)果信息導(dǎo)入到數(shù)據(jù)庫就得到了可用的數(shù)據(jù)庫了。接下來,我們將根據(jù)博客的需要,來選擇開發(fā)的語言和技術(shù)了。