【问题标题】:How best to design database structure for this case?如何最好地为这种情况设计数据库结构?
【发布时间】:2013-03-14 02:18:39
【问题描述】:

我正在为我的大学申请设计一个数据库。 报告实体如下:

每个report 都有一个studentscourses 和学生rating 的列表。

问题在于,随着时间的推移,课程和学生人数可能会发生变化。数据库结构应该灵活且易于适应这些变化。对于这种情况,如何最好地在关系数据库中定义这些实体和设计表之间的关系?

我对这件事有一些想法。也许这个模型最能描述关系并解决问题的问题:

还是REPORT to STUDENT的关系是多余的?一份关系是否足够一份报告?例如只有REPORT to COURSE 没有 REPORT to STUDENT: 哪个选择更好,为什么?这种结构还有其他缺点吗?

提前感谢您的建议!

【问题讨论】:

  • 学生可以属于多个报告吗?当然也一样?
  • 学生是否可能属于报告,即使学生的课程确实属于报告?
  • @Branko 感谢您的提问!首先,是的,学生和课程可以属于多个报告。因为报告可能不同。年报、月报、周报、课报……二、一个学生属于一个报告。报告具有报告和课程属性,它们必须都属于同一个报告。但是我们可以通过评分和课程(report to ratingrating to coursecourse to report)向学生检索报告,不是吗?所以我们不会有数据冗余。你怎么看待这件事?不是很好吗?感谢您的提前!
  • “学生和课程可以属于多个报告” - 那么两种模式都不正确。从表面上看,您需要一个 REPORT 和 COURSE 之间的连接表(可能也适用于学生)。我仍然不清楚“报告”的实际含义。这是由参加课程的学生(和/或讲师)的质量评估吗?还是学生在课程的各个部分获得的分数(或“进度评估”)?可以说报告是一组评级吗?
  • “报告是一组评级?” 是的,我可以说是真的。我应该坚持报告。它是我的应用程序中的关键实体。报告还有编号、标题、日期、批准人、描述等。我不需要讲师的实体。我从中抽象出来。你可以认为我的课程是自学的:)

标签: database database-design data-structures relational-database entity-relationship


【解决方案1】:

“报告是一组评级?”是的

好的,这有点清楚了。我仍然不确定你到底想建模什么,但我会试一试:

评分PK1 确保没有学生可以对同一课程进行多次评分。报告只是一组评级。

此结构确保报告中的所有评分都与同一课程相关,也不以任何方式强制课程出勤2


1 具体来说,REPORT_ID在 PK 之外,因此一个评级不能成为多个报告的一部分。如果你想要相反,你不能只在 PK 中包含该字段,因为这将允许不同的VALUEs - 你需要一个适当的连接表。

2 您可能希望禁止未参加课程的学生对课程进行评分。让我知道您打算如何表示课程出勤率,我可能有一些想法如何将其与评级和报告联系起来......

【讨论】:

  • 哦,谢谢!这是一个非常新鲜有趣的想法!我什至没有想到这一点。但它有一个缺点。我无法仅在 COURSE_IDSTUDENT_ID 两个字段上创建 PK of RATING。这还不够,因为同一课程对同一学生的评分可以在多个报告中。我想我还应该将 REPORT_ID 包含在PK of RATING 中。我会对此架构感到满意。但是你为什么写“在PK中包含那个字段”不好?我不明白。谢谢!
  • @Michael 因为这将允许同一学生/课程组合使用不同的VALUEs。您不想让学生多次(并且可能不同)对同一课程进行评分,对吗?
  • “允许学生对同一课程进行多次评分(并且可能不同)” 是的,这是真的。报告有日期。因此,同一个学生可能在另一个学期对同一科目进行评分。这将是另一份报告。
  • 在这种情况下,也可以将REPORT_ID 添加到复合PK of RATING。这是一个很好的解决方案。我说的对吗?
  • @Michael 如果您想要“每个报告”VALUE(与 VALUE 相比,即使在多个报告中使用时,对于同一个学生/课程组合也必须相同),那么可以确定,继续前进,使REPORT_ID 成为RATING PK 的一部分。
【解决方案2】:

不要在学生表或课程表中包含指向“报告”表的链接。我建议你使用以下结构:

STUDENT
id
forename
surname
dob  
... other fields

LECTURER
id
forename
surname
honorific (Mr/Dr/Professor, etc)
department id
... other fields

COURSE
id
name
duration
credits

SEMESTER
id
course id
lecturer id

RATINGS
semester id
student id
mark

通过这种方式,您可以参加由多位讲师在不同日期教授的课程(例如经济学概论)。学生注册特定学期并获得该学期的分数。如果您希望学生在给定课程/学期中获得多个分数,则将日期字段添加到评分表中。

您的报告通常会查询评级表。

【讨论】:

  • 评分不应该有 course_id 而不是semester_id 吗?
  • @FrankSchmitt:如果我在 12 年冬天选修了经济学,但在 13 年春天又考了一遍又如何?一门课程定义一次,但一个学期会重复发生。
  • 抱歉,我误解了架构 - 我认为一个学期类似于“Winter 12”,而一门课程类似于“Algebra, Winter 12”(所以学期之间会有 1:n 的关系当然,而不是相反)
  • 是的,我同意弗兰克的观点。这种关系是错误的。报告(学期)可以有很多课程,而不是一个。
  • @Michael:所以将该表称为“实例”之类的其他名称。它必须包含课程 ID、讲师 ID 和季节/日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2011-05-18
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
相关资源
最近更新 更多