Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 两个不同实体的注释系统_Mysql_Sql_Database Design - Fatal编程技术网

Mysql 两个不同实体的注释系统

Mysql 两个不同实体的注释系统,mysql,sql,database-design,Mysql,Sql,Database Design,我正在尝试创建一个评论系统。 数据库设计对于这些东西,我想评论一下(帖子和文章): 问题 每个评论都应该链接到帖子或文章。 我的尝试 选项1 我把一个article_id和post_id放在同一个表中,它们都可以留空 TABLE `comments` ( `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `comment_text` text NOT NULL, `user_id` int(11) unsigned NOT N

我正在尝试创建一个评论系统。

数据库设计对于这些东西,我想评论一下(帖子和文章):



问题
每个评论都应该链接到帖子或文章。

我的尝试

选项1
我把一个article_id和post_id放在同一个表中,它们都可以留空

TABLE `comments` (
 `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `comment_text` text NOT NULL,
 `user_id` int(11) unsigned NOT NULL,
 `post_id` int(11) NULL,
 `article_id` int(11) NULL,
 PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
这样,当一篇文章被评论时,会有一个文章id,如果一篇文章被评论,会有一个帖子id。
但是,如果一个字段始终不为NULL,那么将这两个字段都保留为NULL是一个好主意吗?

选项2
创建两个独立的表。一个用于发表评论,一个用于文章评论

TABLE `article_comments` (
     `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
     `comment_text` text NOT NULL,
     `user_id` int(11) unsigned NOT NULL,
     `article_id` int(11) NOT NULL,
     PRIMARY KEY (`article_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

像这样,不应该为NULL的任何人都是NULL。
然而,我不知道这是否会成为一个性能问题,我很确定这会导致我的PHP内容大量重复。

有更好的方法吗?


我没有这方面的经验,非常感谢你的帮助

这里有一些注意事项

对象与关系映射

PHP提供了OO风格的编程,允许您创建一个抽象的文章和帖子的超类,然后可以将评论链接到该类。像这样的OO结构不能很好地映射到关系数据库,尽管很不幸,因此您必须做出妥协

访问数据的用例

您需要如何以及在何处访问注释数据。这可以驱动您构建数据的方式,并有可能使数据非标准化,还可以创建索引

在何处实施数据完整性约束

在可能的情况下,让数据库强制执行干净的数据是很好的,但在现实中,这并不总是可能实现的(或者你必须像上面第二个选项那样跳过障碍)。就个人而言,在这种情况下,我不会费心让数据库为我管理它,而是确保在应用程序中对其进行适当的管理(和错误处理)


最终,我还没有找到一个正确的答案来解决这个问题。在你上面建议的两个选项中,选项1是我自己的偏好。但是,你应该考虑的另一种选择是将你的文章和文章表合并成一个“内容”表,其中包含CordNoType属性或类似内容(这允许你用PHP中的抽象超类和具体子类对它们进行建模)。然后,您的评论表只是泛泛地引用它。

Wow!!非常感谢您深思熟虑的回答!我会考虑你的建议!约翰里克斯很好地总结了这个问题。这个建议是要考虑的:但是,你应该考虑的另一个选择是把你的文章和文章表合并成一个内容类型的表,内容是CordnType属性或类似的。
TABLE `comments` (
 `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `comment_text` text NOT NULL,
 `user_id` int(11) unsigned NOT NULL,
 `post_id` int(11) NULL,
 `article_id` int(11) NULL,
 PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
TABLE `article_comments` (
     `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
     `comment_text` text NOT NULL,
     `user_id` int(11) unsigned NOT NULL,
     `article_id` int(11) NOT NULL,
     PRIMARY KEY (`article_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
TABLE `post_comments` (
         `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
         `comment_text` text NOT NULL,
         `user_id` int(11) unsigned NOT NULL,
         `post_id` int(11) NOT NULL,
         PRIMARY KEY (`article_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;