Mysql
為部落格建構數據庫
我為部落格建立了一個數據庫。我還是一名學生,所以我在這方面的知識有限。我發布這個問題是為了簡要描述我做錯了什麼、為什麼以及如何解決它。我不是後端開發人員,所以如果您對這篇文章有誤解,我會進一步解釋。
這是一個簡單的部落格項目。以下過程適用於管理員和使用者。
行政
- 在部落格上註冊為作者
- 郵政
- 寫文章
使用者
- 查看文章
- 喜歡文章
- 發表評論
- 喜歡評論
下面是我用於上述過程的表格:
- 作者 (擁有部落格的註冊作者)
- 文章 (包含文章所需的所有資訊)
- 評論 (保存評論所需的數據)
- likes_counter (保存使用者對文章或評論的獨特喜歡)
Authors 和 Posts 表關係
我使用一對多關係來連接作者和文章表。每個作者可以寫很多篇文章,每篇文章都需要一個作者。
EER圖如下:
這裡是作者和文章表模式:
CREATE TABLE IF NOT EXISTS `authors` ( `author_ID` bigint(10) unsigned NOT NULL AUTO_INCREMENT, `author_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `author_avatar` text COLLATE utf8_bin NOT NULL, `author_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`author_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `posts` ( `post_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_date` datetime NOT NULL, `post_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `post_status` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT 'draft', `post_type` varchar(10) COLLATE utf8_bin NOT NULL, `post_like_count` int(10) unsigned NOT NULL DEFAULT '0', `post_comment_count` int(11) unsigned NOT NULL DEFAULT '0', `post_has_article` tinyint(4) NOT NULL DEFAULT '0', `article_title` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `article_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`post_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
第一季度
我應該如何建立關係?
評論表
- 每個文章都可以保存評論
- 使用者無法回複評論
- 每條評論都可以收藏
下圖是圖:
和表模式:
CREATE TABLE IF NOT EXISTS `comments` ( `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `comment_post_ID` bigint(20) unsigned NOT NULL, `comment_count` bigint(20) unsigned NOT NULL, `comment_author` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `comment_author_IP` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `comment_date` datetime NOT NULL, `comment_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `comment_approved` tinyint(4) NOT NULL DEFAULT '0', `comment_like_count` int(10) unsigned NOT NULL, `comment_author_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`comment_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
第二季度
我主要關心的是我怎麼知道哪個文章有什麼評論。我創建了一個
comment_count
包含目前文章 ID 的列。例子:
假設我們有 3 篇帶有 id
300, 301, 302
和 4 條評論的文章。然後每一行將採用以下形式:comment_ID - comment_post_ID - comment_count 1 300 1 2 301 1 3 301 2 4 301 3
id 為的文章
302
沒有評論,所以沒有註冊行。我認為是一種多對多的關係,但不完全是。使用正確的形式嗎?Likes_Counter 表
這是迄今為止我做出的最艱難的決定。
- 每篇文章都可以收藏
- 每條評論都可以收藏
- 使用者不需要任何帳戶即可執行該操作。
- 他只能收藏一個項目(單個文章或評論)一次。不允許重複收藏
我真的不知道是否所有這些都應該包含在一張表中。
想法很簡單。我們得到 fav(評論或文章)的 id,並將其分配給相同的命名列。我們還獲得了使用者的 IP 地址。所以最後我們知道使用者是否已經收藏了一個項目。但我不知道我的實現是否良好(並且我可以維護)。
圖表:
架構:
CREATE TABLE IF NOT EXISTS `likes_counter` ( `like_ID` bigint(20) NOT NULL AUTO_INCREMENT, `like_type` varchar(10) COLLATE utf8_bin NOT NULL, `like_content_ID` bigint(20) NOT NULL, `like_IP` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`like_ID`), KEY `like_ID` (`like_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
我知道這是一篇很長的文章,但我已經很感激你的回答了。
提示:
- 如果頭像是圖像,請使用
BLOB
,而不是TEXT
。- 不要在每個列名前加上表名;它不必要地混亂。
- 你不太可能需要
BIGINT
;改為使用INT UNSIGNED
(最大或 40 億)。- 一個
PRIMARY KEY
是一個UNIQUE key
是一個KEY
。所以不要重新索引PK。- 考慮使用和
ENUM
之類的東西。status``type
- A
Post
同時具有article
a 和 acontent
? 這是怎麼回事?- IP 地址,如果保存為字元串,可以是
VARCHAR(39) CHARACTER SET ascii
.