通过外键约束加强关系?

时间:2019-05-12 21:31:25

标签: sql postgresql database-design foreign-keys many-to-many

假设我有以下表格:

问题,选择和答案

每个问题都有很多选择(选择具有question_id外键。)

Answers表具有两个外键question_idchoice_id,这些约束可防止引用不存在的questionchoice的答案,但是我想要也可以防止无效选择。

我如何表达一个约束(也许不是正确的词),该约束仅在choice_id是给定question_id的有效选择的情况下才允许答案?例如,如果我有2个问题,每个问题有2个选择:

  • Q1(id = 1)
    • A(id = 1)
    • B(id = 2)
  • 第二季度(id = 2)
    • C(id = 3)
    • D(id = 4)

我想允许类似(question_id = 1,choice_id = 1(或2)的答案,并禁止类似({{11}} = 1,question_id = 4的答案),因为这不是该问题的有效选择。

2 个答案:

答案 0 :(得分:6)

您所需要的只是从extension UITextField { func clear () { self.layer.sublayers?.forEach { if $0 is CAGradientLayer { $0.removeFromSuperlayer() } } } func underlined(){ clear() let color = UIColor(red: 11/255, green: 95/255, blue: 244/255, alpha: 1).cgColor let sndColor = UIColor(red: 124/255, green: 206/255, blue: 254/255, alpha: 1).cgColor let gradient: CAGradientLayer = CAGradientLayer() gradient.colors = [color, sndColor] gradient.locations = [0.0, 0.8] gradient.startPoint = CGPoint(x: 0, y: 0) gradient.endPoint = CGPoint(x: 1, y: 0) let width = CGFloat(3.0) gradient.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) self.layer.insertSublayer(gradient, at: 0) self.layer.masksToBounds = true } func underlinedGrey(){ clear() let color = UIColor(red: 112/255, green: 112/255, blue: 112/255, alpha: 0.4).cgColor let border = CALayer() let width = CGFloat(3.0) border.borderColor = color border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) border.borderWidth = width self.layer.addSublayer(border) self.layer.masksToBounds = true } } answer的{​​{3}}-choice中的行指向一个适用问题。

如果您坚持要冗余地创建choice列(在某些特殊情况下这很有意义)仍然只有一个 multicolumn FK约束跨越两个列。这首先需要对表answer.question_id进行匹配的多列UNIQUE(或PK)约束(否则通常也是多余的):

choice

然后:

ALTER TABLE choice ADD CONSTRAINT choice_uni UNIQUE (question_id, choice_id);

所有涉及的列都是ALTER TABLE answer ADD constraint answer_choice_fkey FOREIGN KEY (question_id, choice_id) REFERENCES choice(question_id, choice_id); ,或者您可能需要做更多:在这种情况下,首先了解外键约束的不同匹配类型:

相关:

答案 1 :(得分:3)

您的“答案”表为什么有一个question_id

如果仅具有choice_id,它将始终引用现有的选择。选择本身会链接到有效问题,从而唯一确定给定答案用于哪个问题。