为博客构建数据库

5 mysql database-design relations

我为博客建立了一个数据库。我还是学生,所以我在这方面的知识有限。我发布这个问题是为了简要描述我做错了什么,为什么以及如何解决它。我不是后端开发人员,所以如果你误解了这篇文章中的某些内容,我会进一步解释。

这是一个简单的博客项目。以下过程适用于管理员和用户。

行政

  • 在博客上注册为作者
  • 邮政
  • 写文章

用户

  • 查看帖子
  • 喜欢帖子
  • 发表评论
  • 喜欢评论

下面是我用于上述过程的表格:

  • author (持有博客的注册作者)
  • 帖子 (包含帖子所需的所有信息)
  • 评论 (保存评论所需的数据)
  • 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 ;
Run Code Online (Sandbox Code Playgroud)

第一季度

我应该如何建立这种关系?

评论表

  • 每个帖子都可以有评论
  • 用户无法回复评论
  • 每条评论都可以收藏

下图是示意图:

博客的评论数据库图

和表架构:

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 ;
Run Code Online (Sandbox Code Playgroud)

Q2

我主要关心的是我怎么知道哪个帖子有什么评论。我创建了一个comment_count包含当前帖子 ID 的列。

例子:

假设我们有三篇带有 id300, 301, 302和 4 条评论的文章。然后每一行将采用以下形式:

comment_ID  -  comment_post_ID - comment_count
1              300               1
2              301               1
3              301               2
4              301               3
Run Code Online (Sandbox Code Playgroud)

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 ;
Run Code Online (Sandbox Code Playgroud)

我知道这是一篇很长的文章,但我已经很感激你的回答了。

Ric*_*mes 4

尖端:

  • 如果头像是图像,请使用BLOB,而不是TEXT
  • 不要在每个列名前添加表名;它不必要地混乱。
  • 你不太可能需要BIGINT;改为使用INT UNSIGNED(最多 40 亿)。
  • 一个PRIMARY KEY是一个UNIQUE key是一个KEY。所以不要重新索引 PK。
  • 考虑使用ENUM诸如status和 之类的东西type
  • APost同时具有 anarticle和 a content? 这是怎么回事?
  • IP 地址(如果保存为字符串)可以是VARCHAR(39) CHARACTER SET ascii.