简单的数据库表设计/布局

时间:2009-10-23 04:00:42

标签: sql sql-server database-design data-modeling

我只是想知道,作为一个假设的示例,为以下场景布置表格的最佳方法是什么:

假设我正在编写一个用于跟踪学生出勤率的应用。在每年年初,我想要添加所有学生(我将手动执行此操作 - 现在,是否应将学生ID分配给每个学生?让我们称之为学生)。现在,每天,我将在表学生中显示所有学生,并允许用户选择出勤。

那么,我该如何摆桌子呢? (如果你不明白我的意思,我的意思是应该在每一栏,行中输入什么数据......)例如,可能有一个学生表,其中包含学生ID,并且每个学生每天都要创建一个新行。第1列的出勤表:学生ID,第2列:日期,第3列:状态(存在/不存在)。但是,这似乎并不是非常有效。你觉得怎么样?

更新:从所有这些第一个答案中,似乎一个学生在学生出勤表中的每一行(他/她被指定为出席/缺席),但如果我是否包括每行不止一个学生ID,对所有在某一天缺席的学生说?这会更好还是更糟(可能是模棱两可的)?实际上,我开始认为效率会降低,因为这一举动的唯一行动甚至可以很容易地完成。嗯...

5 个答案:

答案 0 :(得分:2)

STUDENTS

  • STUDENT_ID,pk
  • FIRST_NAME
  • LAST_NAME

STUDENT_ATTENDANCE

  • STUDENT_ID,pk,fk
  • ABSENT_DATE,pk

不需要IS_ABSENT列 - 日期表示学生缺席,以及日期。可能会比缺席的人数少,所以只存储缺席的日期。

使主键成为两列的复合,可确保您不会重复。

  

如果我要在每行中包含多个学生ID,对所有在某一天缺席的学生说什么呢?这会更好还是更糟

然后,您要么将其他student_ids存储为单个列中的逗号分隔列表,要么为每个其他student_id存储其他列。每个student_id的附加列永远不会有效 - 您每年都会为每个新学生添加一列。连接student_ids列表更加切合实际,但如果要报告特定学生或学生组,则需要提取详细信息。由于字符限制,它存在无法存储单个列可能缺少的每个student_id的风险。

我建议使用我建议的STUDENT_ATTENDANCE表。

答案 1 :(得分:2)

关于数据库设计的关键是提供一个完整的模型。因此,在您的示例中,您不希望记录学生缺席的日期,这些日期属于周末,假日或插入日期。所以你还需要一个CALENDAR表。 STUDENT_ABSENCE将是STUDENT和CALENDAR之间的交叉表。也就是说,它将拥有STUDENT表中ID和CALENDAR中DAY的外键。

这可能看起来像是过度工程,但几乎学校里发生的一切都涉及日程安排,因此日历必不可少。您也可以尽可能地使用它来构建最佳模型。

另外,请考虑STUDENT_ABSENCE表需要的其他属性。在我的头脑中,您可能会记录是否提前通知缺席(例如,在学期期间的家庭假期),缺勤是否被批准,缺席是否是由于疾病。

答案 2 :(得分:1)

我有一个带有StudentID的表MissedClasses作为外键,日期,过程,也许是句点,也许还有另一个列可供借口。如果他们没有参加,请提交一个条目。

我的理由:希望大多数人都会参加大部分课程,所以你只需要跟踪失误。

答案 3 :(得分:1)

如果将多个值组合到一个值列表中并将其存储在一个单元格中,那么您的表格将不再是最初由Codd定义的普通形式。您可以通过在表格中存储表格来符合由Date重新定义的第一范式。大多数新手不这样做。它们通常将值列表混合成逗号分隔的字符串,并将整个列表存储为单个原子值。

他们后来发现的是,他们无法再利用关系运算符的强大功能,尤其是连接,以便以简单的方式表达复杂的操作。这通常会使新手付出的代价超过“低效率”。即使你把一个表放在一个表中,你也会发现用数据做常规的事情要比以前更难。

您获得的大多数好建议都涉及分解表以实现规范化架构。这通常是你遵循的最佳计划,直到你稍后学习什么时候打破规范化规则以及何时遵循它们。

这不适用于典型的12岁儿童。你听起来不像一个典型的12岁。因此,我试图让您了解良好数据库设计的基础知识,而不是让您在高中学习糟糕的数据库设计,然后不得不忘掉它并在以后重新开始。

答案 4 :(得分:0)

我会有一个学生表,其中包含学生ID和每个学生特有的信息,如姓名,年级等。然后有一个student_attendance表,其中包含学生ID,日期,状态(出席/缺席)。

虽然这确实收集了大量数据,但实际上并不是那么多数据,它可以让你很容易地运行几种报告。

你不希望将更多的学生ID放在一行中,因为虽然你的行数较少,但你会得到同样多的数据并查询表/报告会很尴尬。