外键能否作为主键?——选课表最低出勤规则的数据库设计咨询
关于选课表与最低出勤要求的数据库设计分析
咱们结合你的需求和给出的示例表结构,一步步拆解问题:
一、是否需要创建MINIMAL_ATTENDANCE表?
从当前业务逻辑来看,暂时不需要单独创建这个表,原因如下:
- 科目基础最低出勤要求是科目本身的固有属性,和
SUBJECTS表的NAME、NUMBER_OF_TESTS字段属于同一类核心信息,直接放在SUBJECTS表的M_ATTENDANCE字段里,更符合数据库设计的"单一职责"原则,没必要做无意义的表拆分。 - 只有当未来业务出现变化(比如一个科目需要对应多套基础出勤要求,例如分学期、分授课班级设置不同规则),此时单独建表存储多对一关系才有价值。目前你的需求是每个科目对应一个基础要求,
SUBJECTS表完全能承载。
二、若创建MINIMAL_ATTENDANCE表,用SUBJECTS主键作为其主键是否合理?
如果后续业务确实需要拆分出这个表,用SUBJECTS的主键作为MINIMAL_ATTENDANCE的主键是非常合理的设计:
- 这是典型的一对一关系设计,每个科目只会对应一个基础出勤要求,相同的主键能保证两者严格一一绑定,不会出现数据冗余或不一致的情况。
- 这种设计还能简化关联查询,不需要额外添加外键字段,直接通过主键关联即可,性能和维护成本都很低。
额外小建议:关于ENROLLMENTS表的M_ATTENDANCE字段
你示例里ENROLLMENTS的M_ATTENDANCE是计算后的结果(有工作的学生降低要求),这里可以根据业务场景调整:
- 如果允许实时计算(比如查询时通过
STUDENTS.HIRED和SUBJECTS.M_ATTENDANCE动态算出最终要求),建议不存储这个字段,避免后续科目基础要求或学生工作状态变化时,出现历史数据不一致的问题。 - 如果需要固定记录学生选课时的生效要求(比如后续科目基础要求调整,不影响已选课学生的规则),那存储这个字段是合理的,记得在插入ENROLLMENTS数据时做好计算逻辑。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

