Mysql

為部落格建構數據庫

  • July 4, 2018

我為部落格建立了一個數據庫。我還是一名學生,所以我在這方面的知識有限。我發布這個問題是為了簡要描述我做錯了什麼、為什麼以及如何解決它。我不是後端開發人員,所以如果您對這篇文章有誤解,我會進一步解釋。

這是一個簡單的部落格項目。以下過程適用於管理員和使用者。

行政

  • 在部落格上註冊為作者
  • 郵政
  • 寫文章

使用者

  • 查看文章
  • 喜歡文章
  • 發表評論
  • 喜歡評論

下面是我用於上述過程的表格:

  • 作者 (擁有部落格的註冊作者)
  • 文章 (包含文章所需的所有資訊)
  • 評論 (保存評論所需的數據)
  • 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 篇帶有 id300, 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
  • APost同時具有articlea 和 a content? 這是怎麼回事?
  • IP 地址,如果保存為字元串,可以是VARCHAR(39) CHARACTER SET ascii.

引用自:https://dba.stackexchange.com/questions/145222