5 mysql database-design relations
我为博客建立了一个数据库。我还是学生,所以我在这方面的知识有限。我发布这个问题是为了简要描述我做错了什么,为什么以及如何解决它。我不是后端开发人员,所以如果你误解了这篇文章中的某些内容,我会进一步解释。
这是一个简单的博客项目。以下过程适用于管理员和用户。
行政
用户
下面是我用于上述过程的表格:
我使用一对多关系来连接作者和帖子表。每个作者可以写多篇文章,而每篇文章只需要一个作者。
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)
我主要关心的是我怎么知道哪个帖子有什么评论。我创建了一个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没有评论,所以没有记录行。我认为是一种多对多的关系,但不完全是。使用正确的表格吗?
这是迄今为止我做出的最艰难的决定。
我真的不知道所有这些是否应该真正包含在一张表中。
想法很简单。我们获得 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)
我知道这是一篇很长的文章,但我已经很感激你的回答了。
尖端:
BLOB,而不是TEXT。BIGINT;改为使用INT UNSIGNED(最多 40 亿)。PRIMARY KEY是一个UNIQUE key是一个KEY。所以不要重新索引 PK。ENUM诸如status和 之类的东西type。Post同时具有 anarticle和 a content? 这是怎么回事?VARCHAR(39) CHARACTER SET ascii.| 归档时间: |
|
| 查看次数: |
36804 次 |
| 最近记录: |