【发布时间】:2020-05-06 06:25:31
【问题描述】:
我有一个关于在数据库中选择表设计的偏好的问题。
首先,我有三个表,分别用于用户、帖子、评论
此模式显示表:
此用户架构:
CREATE TABLE `Users` (
`id` int(11) NOT NULL,
`fullname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`profileImg` varchar(255) DEFAULT NULL,
`appPackage` varchar(50) DEFAULT NULL,
`email` varchar(255) NOT NULL,
`token` text NOT NULL,
`gender` enum('male','female') DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `Users`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `email` (`email`);
此帖子架构:
CREATE TABLE `Posts` (
`id` int(11) NOT NULL,
`userId` int(11) NOT NULL,
`text` varchar(255) COLLATE utf8mb4_bin NOT NULL,
`background` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL,
`img` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`country` varchar(25) COLLATE utf8mb4_bin DEFAULT NULL,
`countryCode` varchar(2) COLLATE utf8mb4_bin DEFAULT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`CommentsCount` int(11) NOT NULL,
`likes` int(11) NOT NULL DEFAULT '0',
`views` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
ALTER TABLE `Posts`
ADD PRIMARY KEY (`id`),
ADD KEY `users_post_userId_fk` (`userId`);
这个 cmets 架构:
CREATE TABLE `Comments` (
`id` int(11) NOT NULL,
`postId` int(11) NOT NULL,
`userId` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`commentText` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `Comments`
ADD PRIMARY KEY (`id`),
ADD KEY `users_comments_userId_fk` (`userId`),
ADD KEY `users_comments_postId_fk` (`postId`);
我想查询 Posts 表,每次查询都会为每个帖子带来 10 行 cmets 计数。
哪个是最好的选择?
通过加入查询 Posts 表以获得这样的 cmets 计数:
SELECT * ,
(SELECT COUNT(*)
FROM Comments
WHERE Comments.postId = Posts.id) AS commentsCount
FROM Posts
ORDER BY Posts.id DESC
LIMIT 0,10
或者在帖子表中创建一个列commentsCount,其中包含每个帖子的 cmets 数。
并创建一个链接到 cmets 表的触发器,其中,当插入新评论时,cmetsCount 中的一个数字会增加,而当删除评论时,commentsCount 中的一个数字会减少。
查询变成只有一个posts表来获取posts和comment count:
SELECT * FROM Posts ORDER BY Posts.id DESC LIMIT 0,10
提前致谢!
【问题讨论】:
-
请将表格的架构发布为文本,而不是图像。否则,我们无法复制/粘贴来重建表格
-
简答:用查询来做。计算得到的应该是计算得到的。否则,您正在复制信息。 DRY !