Mysql 引用一个表字段的多个表

Mysql 引用一个表字段的多个表,mysql,foreign-keys,innodb,Mysql,Foreign Keys,Innodb,有两个表-帖子和评论: create table posts ( id integer not null primary key auto_increment, body text not null ); create table comments ( id integer not null primary key auto_increment, body text not null, post_id integer not null reference

有两个表-帖子和评论:

create table posts
(
    id integer not null primary key auto_increment,
    body text not null
);

create table comments
(
    id integer not null primary key auto_increment,
    body text not null,
    post_id integer not null references posts(id)
);
现在我想再创建一个表报告(“坏帖子”标志),并希望它存储帖子和评论的报告

create table reports
(
    id integer not null primary key auto_increment,
    obj_type tinyint not null, /* '1' for posts and '2' for comments */
    obj_id integer not null,
    body text not null
);

alter table reports add foreign key(obj_id) references posts(id) on delete cascade;
alter table reports add foreign key(obj_id) references comments(id) on delete cascade;
正如您所看到的,在一个字段中有两个引用(我通过obj_id来区分它们),问题是-这样做可以吗

如果不是,什么是更好的解决方案


提前感谢。

直觉上,这感觉不是正确的方法。我想MySQL也会感到困惑;它将如何验证约束是否得到满足;它会先尝试
发布
,还是先尝试
评论
。。。也许两者都有

我个人会选择创建两个链接表:

  • 评论报告
  • 发布报告

这样,您就可以正确地消除对象id的歧义。

直觉上认为这样做不正确。我想MySQL也会感到困惑;它将如何验证约束是否得到满足;它会先尝试
发布
,还是先尝试
评论
。。。也许两者都有

我个人会选择创建两个链接表:

  • 评论报告
  • 发布报告

这样,你就可以正确地消除obj_id的歧义。

你只需要引用你的comments表,因为它已经引用了posts表,这样每当你得到一份报告,你就有了注释的键和post的键。

你只需要引用你的comments表,因为它已经引用了posts表,这样,每当你得到一份报告,你就有了评论和帖子的密钥。

实际上我使用的是Yii php框架,我可以从那里处理“删除级联”。我需要外键只是为了使用ORM级别关系。重要的是,帖子和评论只是一个例子,实际上我需要4个表的标志。我想要一些没有额外4个表的灵活方式。@老实说,我不知道MySQL是如何将这两个外键分开的=/也许这是一个特殊功能?我不知道,但我不喜欢创建多个FK,看起来不是一个优雅的解决方案)好的,如果我决定使用链接表,我会选择你的答案作为解决方案@drcolosos说有很多FK没关系,或者我理解错了吗?@Acute他实际上不是指外键带来的约束,只是指键引用另一个表和表选择器字段的想法。另请参阅:实际上我使用的是Yii-php框架,我可以从中处理“on-delete-cascade”。我需要外键只是为了使用ORM级别关系。重要的是,帖子和评论只是一个例子,实际上我需要4个表的标志。我想要一些没有额外4个表的灵活方式。@老实说,我不知道MySQL是如何将这两个外键分开的=/也许这是一个特殊功能?我不知道,但我不喜欢创建多个FK,看起来不是一个优雅的解决方案)好的,如果我决定使用链接表,我会选择你的答案作为解决方案@drcolosos说有很多FK没关系,或者我理解错了吗?@Acute他实际上不是指外键带来的约束,只是指键引用另一个表和表选择器字段的想法。另见: