2017-06-21 46 views
2

我有一个comments表,评论或者参考答案或为外键的问题:如何设计这两个表来防止损坏的数据?

id primary key not null, 
question_id references questions(id), 
answer_id references answers(id), 

要么answer_idquestion_id将被填充和其他将是空的。

现在其他表是notifications,只要创建一个评论,我创建了一个通知:

id primary key not null, 
comment_id references comments(id), 
question_id references questions(id), 
answer_id references answers(id), 

无论question_idanswer_id将被填充,但我想,以确保它与什么填充它一致comment记录。

如何确保通知将引用由评论本身引用的相同资源?换句话说,如果我有一个引用问题的评论,然后我想为该评论创建一个通知,但是让它引用一个答案,那么数据库不应该允许这样做。我如何施加这样的限制?

+1

我想你可能能够解决问题,使用继承和有三种不同类型的通知表。 –

+0

您目前的设计似乎没有正常化。 –

+0

@TimBiegeleisen你能提出一种方法来标准化评论表吗? –

回答

2

您应该对表格进行规范化处理,并使用通知中的引用来评论以查找question_id和answer_id。

create table comments (
    id serial primary key, 
    question_id int references questions(id), 
    answer_id int references answers(id) 
); 

create table notifications (
    id primary key not null, 
    comment_id int references comments(id) 
); 

访问使用加入日期:

select question.* 
from notifications 
join comments on comments_id = comments.id 
join questions on question_id = questions.id; 
+0

有趣的是,你认为给通知添加一个新的类型'type'也是一个好主意,以告诉这个评论是否引用了一个问题或答案? –

+0

NVM我的评论,很好的答案,非常感谢! –

+2

Id'说不,这将是另一个可能不一致的数据点(一行标记为“问题”,但仅与答案链接)。 如果它对您有帮助,您可以定义包含计算类型字段的视图。 – edruid

-1

我觉得你在做这个过于复杂。 你应该有一个表格,其中有评论和类型。没有需要的空间和正常化

CREATE TABLE comments (
id INT PRIMARY KEY, 
comment VARCHAR, 
is_answer BOOLEAN 
);