复合主键或外键

时间:2013-01-08 14:11:15

标签: tsql database-design

我有一个数据模型如下......

  • 主题可以有多个练习(ExerciseTopic(FK)引用TopicId(PK))
  • 练习可以有多个问题(练习(FK)参考练习Id(PK))
  • 一个问题可以有多个(4)AnswerChoices

enter image description here

我想为AnswerChoices表提供一个三部分主键,因为这个组合将唯一地标识每个选项。

  • 我是否需要AnswerChoices表中的外键用于数据完整性目的或
  • 复合主键是否足够?如果需要外键,它是两部分复合外键(ExerciseId,QuestionId)?

示例数据......

  • 主题(T1)
    • 练习E1
      • 问题1(AnswerChoices:a,b,c,d)
      • 问题2(AnswerChoices:a,b,c,d)
      • 问题3(AnswerChoices:a,b,c,d)
    • 练习E2
      • 问题1(AnswerChoices:a,b,c,d)
      • 问题2(AnswerChoices:a,b,c,d)
      • 问题3(AnswerChoices:a,b,c,d)
    • 练习E3
      • 问题1(AnswerChoices:a,b,c,d)
      • 问题2(AnswerChoices:a,b,c,d)
      • 问题3(AnswerChoices:a,b,c,d)
  • 主题(T2)
    • 练习E1
      • 问题1(AnswerChoices:a,b,c,d)
      • 问题2(AnswerChoices:a,b,c,d)
      • 问题3(AnswerChoices:a,b,c,d)
    • 练习E2
      • 问题1(AnswerChoices:a,b,c,d)
      • 问题2(AnswerChoices:a,b,c,d)
      • 问题3(AnswerChoices:a,b,c,d)
    • 练习E3
      • 问题1(AnswerChoices:a,b,c,d)
      • 问题2(AnswerChoices:a,b,c,d)
      • 问题3(AnswerChoices:a,b,c,d)

2 个答案:

答案 0 :(得分:1)

看起来就像你在AnswerChoices中需要一个四列密钥:{TopicID,ExerciseID,QuestionID,ChoiceID}。表“AnswerChoices”应该有一个foreign key (TopicID, ExerciseID, QuestionID) references Questions (TopicID, ExerciseID, QuestionID)

答案 1 :(得分:0)

不需要是“或” 可以有复合和外国的 一个选项

Exercise:
PK TopicID FK to Topic
PK ExerciseID

Question:
PK TopicID FK to Exercise
PK ExerciseID FK to Exercise
PK QuestionID

AnswerChoices:
PK TopicID FK to Question
PK ExerciseID FK to Question
PK QuestionID FK to Question
PK ChoiceID

UserAnsers:
PK UserID FK to Users
PK TopicID FK to AnswerChoices
PK ExerciseID FK to AnswerChoices
PK QuestionID FK to AnswerChoices
PK ChoiceID FK to AnswerChoices

如果用户只能选择一个答案,那么请关闭ChoiceID