在園子裏也混了三年多,隨筆200多,一開始只是想把本身的經驗寫一下,後來呢弄出來了一個「天然框架」,主要精力就放在了介紹天然框架的思路上面了。隨筆多了就發現一個問題:有點亂。雖然博客有分組,可是隻支持一級分組,不支持n級的。博客裏也沒有「欄目」這一類的設置。因此對於隨筆的管理有有點力不從心了。有些兄弟看到個人博客,看到我說天然框架,而後就會很迷茫,天然框架究竟是什麼?能作什麼?若是想看看的話,從什麼地方開始看,按照什麼順序來看?程序員
博客的這種形式就不大好解決這種需求了,固然也許是我對博客還不瞭解,沒有用好吧。因此我想作一個網站,這個網站專門介紹天然框架。一開始只想作一個靜態的,內容也很少嘛,作幾個頁面,介紹一下,把博客裏的隨筆整理一下作個目錄便於閱讀。可是試了一下才發現,靜態頁面好麻煩呀,也許是我太懶了吧,老是想簡單一些。因而就想作一個簡單的CMS,而後用這個CMS來作天然框架的介紹網站。數據庫
您可能會說了,海洋又在重複製造輪子了,網上有一大堆現成的,有不少成熟的不去用,本身寫什麼呀?框架
首先呢,我是程序員(嘿嘿),我先想到的是我本身能不能作出來?別人能作我爲何不行?我不是顧客,我也不是有錢人,處處去弄現成的。其次呢,作一個CMS也是一個練手的機會,同時也是天然框架的一個Demo,比較大的、完整的Demo。藉此來講明天然框架的使用方式,和在網頁裏的做用。最後就是想借此說一下個人設計數據庫的思路。我以爲個人設計數據庫的思路仍是有點特點的。數據庫設計
好了,開始進入正題。ide
首先是瞭解需求。一個網站會有什麼?首頁、新聞(圖文形式的信息)、產品介紹、文件下載、圖片瀏覽、在線視頻等。這些都算是「內容」的幾種形式吧,固然還能夠有其餘的形式。網站
這個需求比較簡單,也比較簡陋,暫時就以這個需求來進行設計吧。若是是按照面向對象的方式要如何設計呢?這個我不太清楚,也許是要畫一個UML吧,也許要建模。嘗試一下,畫了一個UML不知道對不對,拿出來請你們批批。設計
【CMS的類圖】視頻
圖很簡單也沒什麼具體的屬性,由於需求是變化的,如今也沒有太具體的需求,因此屬性就先設置幾個主要的。另外俺英文很差,怕查出來的英文單詞不正確產生歧義,因此直接用漢字了。可能您看着很彆扭,可是至少不會產生什麼歧義,理解起來也會比較容易吧,呵呵。對象
「內容」做爲父類,其餘的做爲子類。內容是一種「抽象」,把各類形式的內容的共同部分提煉出來,好比標題、內容、添加人、添加日期、點擊量等。子類負責各自特有的屬性。blog
我以爲這種提煉的方式比較好,在設計數據庫表結構的時候能夠借鑑一下。因而就有了這樣的數據庫設計。
【CMS ER圖】
「內容」做爲主體和中心,其餘的都是爲了這個中心(內容)來服務的。左面是對內容的限制,欄目至關於大分類,分類就是小分類(能夠是n級的),類型就是內容的形式,好比圖文、下載、視頻、圖片等。右面是擴展。擴展和類型是一一對應的。
這就造成了一個「骨架」,骨架是以「內容」爲中心,ArticleID做爲關聯字段,能夠增長擴展表,可是都要以ArticleID做爲關聯字段。至於有多少擴展表,那就能夠根據實際需求來變化,表裏的字段也是能夠根據需求來增減。
設置這種「骨架」的好處:雖然擴展表、字段會有變化,可是「骨架」結構是不變的。這樣一是可讓結構清晰,抓住中心、重點;二是當需求變化的時候,對結構的影響降到最低;三是,若是對於這種「骨架」習慣、掌握了以後,在看到其餘項目的設計就會很容易進入和讀懂。關於第三點,之後你們就會理解的。
基本思路就是這樣,拋磚引玉了。
ps:CMS的字段說明
表編號 | 字段編號 | 字段名 | 中文名 | 類型 | 大小 | 默認值 | 容許空 | 說明 |
5000 | 0 | CMS_Channel | 網站欄目 | |||||
5000 | 10 | ChannelID | 主鍵 | int | 4 | 1 | 0 | 主鍵,自增 |
5000 | 20 | channelName | 欄目名稱 | nvarchar | 30 | _ | 0 | 欄目名稱 |
5000 | 30 | Sort | 排序 | int | 4 | 10 | 0 | 小號在前 |
5000 | 40 | URL | 欄目的網址 | nvarchar | 50 | _ | 0 | 新聞內容 |
5005 | 0 | CMS_ArticleClass | 內容的n級分組 | |||||
5005 | 10 | ClassID | 主鍵 | int | 4 | 1 | 0 | 主鍵,自增 |
5005 | 20 | ChannelID | 所屬欄目 | int | 4 | 0 | 所屬欄目 | |
5005 | 30 | Class | 文章分類 | nvarchar | 30 | 0 | 支持n級分類,也能夠不分類 | |
5005 | 40 | ParentID | 父ID | int | 4 | 0 | 以備n級分類 | |
5010 | 0 | CMS_Article | 網站裏的內容 | |||||
5010 | 10 | ArticleID | 主鍵 | int | 4 | 1 | 0 | 主鍵,自增 |
5010 | 30 | ChannelID | 所屬欄目 | int | 4 | 1 | 0 | 所屬欄目 |
5010 | 40 | ClassID | 分類 | int | 4 | 0 | 0 | 支持n級分類,也能夠不分類 |
5010 | 50 | TypeID | 類型 | int | 4 | 0 | 0 | 1:新聞;2:下載;3:其餘待定 |
5010 | 20 | Title | 標題 | nvarchar | 30 | 0 | 內容的標題 | |
5010 | 60 | Summary | 簡介 | nvarchar | 30 | 0 | 內容的概要介紹 | |
5010 | 70 | Content | 內容 | ntext | 16 | 0 | 圖文內容 | |
5010 | 80 | Hits | 人氣 | int | 4 | 0 | 點擊量 | |
5010 | 90 | SearchText | 搜索 | ntext | 16 | 0 | 搜索內容 | |
5010 | 100 | AddedDate | 添加日期 | smalldatetime | 4 | GetDate() | 0 | 記錄添加日期 |
5010 | 110 | AddedPersonID | 添加人 | int | 4 | 1 | 0 | 添加人 |
5010 | 120 | UpdatedDate | 最後修改日期 | smalldatetime | 4 | GetDate() | 0 | 記錄最後修改日期 |
5010 | 130 | UpdatedPersonID | 最後修改人 | int | 4 | 1 | 0 | 記錄哪一個人最後修改的 |
5020 | 0 | CMS_DownLoad | 下載 | |||||
5020 | 10 | DownLoadID | 主鍵 | int | 4 | 1 | 0 | 主鍵,自增 |
5020 | 20 | ArticleID | 內容ID | int | 4 | 1 | 0 | 關聯 「內容」表 |
5020 | 30 | Title | 標題 | nvarchar | 30 | 0 | 下載的說明,好比「本地下載」、「博客園下載」 | |
5020 | 40 | DownURL | 下載地址 | nvarchar | 30 | 0 | 下載地址,能夠是文件地址也能夠是網頁地址 | |
5020 | 50 | DownCount | 下載次數 | int | 4 | 1 | 0 | 下載/訪問次數 |
5020 | 60 | AddedDate | 上傳時間 | smalldatetime | 4 | GetDate() | 0 | 上傳文件的時間 |
5020 | 70 | Version | 版本 | nvarchar | 30 | 0 | 文件的版本 |