1

有两个表 - 帖子和评论:

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 区分它们),问题是 - 这样做可以吗?

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

提前致谢。

4

2 回答 2

1

直觉上感觉这不是正确的做法。我认为 MySQL 也会感到困惑;它如何验证是否满足约束;它会posts先尝试,还是comments先尝试……也许两者兼而有之?

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

  • comments <-> reports
  • posts <-> reports

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

于 2012-05-24T12:40:06.597 回答
0

您只需要引用您的评论表,因为它已经引用了帖子表,这样每当您收到报告时,您就拥有评论的关键和帖子的关键。

于 2012-05-24T12:40:10.110 回答