好的。最近我一直在为我的小网站做simpel编码有一些问题。目前我有这个数据库设计。
CREATE TABLE IF NOT EXISTS `posts` (
`post_id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`topic` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`ip` varchar(39) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0.0.0.0',
`hashtag` VARCHAR(255),
PRIMARY KEY (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `comments` (
`comment_id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`uid` INT(11),
`post_id_fk` int(11) NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`ip` varchar(39) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0.0.0.0',
`hashtag` VARCHAR(255),
FOREIGN KEY(post_id_fk) REFERENCES posts(post_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
正如你所看到的,我必须联合并加入表来获取信息并与外键进行大量斗争。
将数据库设计更改为:
是否有利CREATE TABLE IF NOT EXISTS `comments` (
`comment_id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`uid` INT(11),
`comment_id_fk` int(11) NOT NULL,
`topic` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`ip` varchar(39) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0.0.0.0',
`hashtag` VARCHAR(255),
FOREIGN KEY(comment_id_fk) REFERENCES (comment_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
因此评论可以作为"帖子"以及评论。如果可能将外键留空。或者外键可能甚至不是必需的?
这是要走的路吗?或者我应该继续使用两张桌子吗?
答案 0 :(得分:0)
这些结构完全不同,您没有提供足够的信息来回答这个问题。以下是两个重要的区别:
topic
复制到评论中。这意味着评论的主题可能与相应帖子上的topic
不同。这可能是好事也可能是坏事。我只是指出它是不同的。这些是重要的设计考虑因素。你的问题没有为局外人提供足够的信息来判断哪个更接近你的实际意图。
作为一般规则,我会偏向第一种方法,因为我认为“帖子”和“评论”是两个不同的东西,因此值得成为独立的实体。例如,在Stack Exchange,帖子(“问题”)有标签,评论没有,帖子有标题和评论没有,评论有长度限制,帖子没有。