【发布时间】:2017-06-21 22:10:18
【问题描述】:
我有一个comments 表,评论可以引用答案或问题作为外键:
id primary key not null,
question_id references questions(id),
answer_id references answers(id),
answer_id 或 question_id 将被填充,另一个将为空。
现在另一个表是notifications,每当创建评论时,我都会创建一个通知:
id primary key not null,
comment_id references comments(id),
question_id references questions(id),
answer_id references answers(id),
question_id 或 answer_id 将被填充,但我想确保它与为该 comment 记录填充的内容一致。
如何确保通知引用评论本身引用的相同资源?换句话说,如果我有一个引用问题的评论,然后我想为该评论创建一个通知但让它引用一个答案,那么数据库不应该允许这样做。我该如何施加这样的约束?
【问题讨论】:
-
我认为您可以使用继承和三种不同类型的通知表来解决问题。
-
您当前的设计似乎没有标准化。
-
@TimBiegeleisen 你能建议一种方法来规范化 cmets 表吗?
-
如果您确实希望将
question_id和answer_id保留在notifications表中,则创建一个由三列(comment_id, question_id, answer_id)和仅引用comments表组成的外键。 Postgres supports it. -
@TimBiegeleisen 您在滥用“规范化”。这意味着一个表不能被连接到它的投影有效地替换。
标签: sql postgresql database-design