【问题标题】:Simple Database Table Design/Layout简单的数据库表设计/布局
【发布时间】:2010-12-09 08:08:24
【问题描述】:

我只是想知道,作为一个假设的示例,在以下情况下布局表格的最佳方式是什么:

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

那么,我应该如何布置我的桌子? (如果您不明白我的意思,我的意思是应该在每一列、每一行中输入什么数据......)例如,可能有一个学生表,其中包含学生 ID,并且每天为每个学生在考勤表,第 1 列:学生 ID,第 2 列:日期,第 3 列:状态(出席/缺席)。但是,这似乎不是很有效。你怎么看?

更新:从所有这些第一个答案来看,学生出勤表的每一行中似乎都有一个学生(他/她被指定为出席/缺席),但如果我是否每行包含一个以上的学生证,比如某天缺勤的所有学生?那会更好还是更糟(可能是模棱两可的)?实际上,我开始认为效率会降低,因为这一举措甚至可以帮助的唯一行动已经可以轻松完成。嗯……

【问题讨论】:

  • 不,我不上编程课,我是个业余爱好者,只是为了好玩(我才 12 岁,哎呀!)。这个问题的目的只是让自己熟悉如何可视化这种情况,即使我在问题中概述的情况完全是随机的。
  • “假设”示例是关于学生的事实......是的,那是家庭作业。
  • 嗯,这不是家庭作业(我才 12 岁,伙计们!他们在学校不教编程。),但听起来确实如此;)
  • 哥们,如果你也在弹钢琴,那就加油吧! (检查了您个人资料网页上的链接。)

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


【解决方案1】:

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 表。

【讨论】:

    【解决方案2】:

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

    这可能看起来像是过度设计,但学校中发生的几乎所有事情都涉及日程安排,因此日历是必不可少的。你不妨尽可能多地使用它,尽可能地构建最好的模型。

    另外,请考虑 STUDENT_ABSENCE 表还需要哪些其他属性。我想你可能会记录什么是否提前通知缺勤(例如学期期间的家庭假期),是否批准缺勤,是否因病缺勤。

    【讨论】:

      【解决方案3】:

      我有一个 MissedClasses 表,其中 StudentID 作为外键、日期、课程,也许还有时间段,也许还有另一列表示是否原谅。如果他们没有参加,请填写。

      我的理由:希望大多数人都能参加大部分课程,所以您只需要跟踪错过的课程。

      【讨论】:

        【解决方案4】:

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

        他们后来发现,他们不能再利用关系运算符(尤其是连接)的力量来以简单的方式表达复杂的运算。这通常比“低效率”花费更多的新手。即使您确实将表格放在表格中,您也会发现使用数据执行常规操作比实际操作要困难得多。

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

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

        【讨论】:

          【解决方案5】:

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

          虽然这确实收集了很多数据,但实际上并没有那么多数据,它可以让您非常轻松地运行多种考勤报告。

          您不希望将多个学生 ID 放在一行中,因为尽管行数更少,但您将拥有同样多的数据,并且查询表/报告会很麻烦。

          【讨论】:

            猜你喜欢
            • 2015-05-17
            • 1970-01-01
            • 2021-04-05
            • 1970-01-01
            • 2011-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多