Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 简单的数据库表设计/布局_Sql_Sql Server_Database Design_Data Modeling - Fatal编程技术网

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

Sql 简单的数据库表设计/布局,sql,sql-server,database-design,data-modeling,Sql,Sql Server,Database Design,Data Modeling,我只是想知道,作为一个假设的示例,为以下场景布局表格的最佳方式是什么: 假设我正在编写一个用于跟踪学生出勤情况的应用程序。在每年年初,我都想把所有的学生都添加进去(我会手工操作——现在,应该给每个学生分配一个学生ID吗?让我们称之为学生表)。现在,每天,我都要显示表中的所有学生学生,并允许用户选择出勤 那么,我该如何布置我的桌子呢?(如果您不理解我的意思,我的意思是在每列、每行中输入什么数据…)例如,可能有一个带有学生ID的学生表,并且每天为每个学生在考勤表中创建一个新行,列1:学生ID,列2:

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

假设我正在编写一个用于跟踪学生出勤情况的应用程序。在每年年初,我都想把所有的学生都添加进去(我会手工操作——现在,应该给每个学生分配一个学生ID吗?让我们称之为学生表)。现在,每天,我都要显示表中的所有学生学生,并允许用户选择出勤

那么,我该如何布置我的桌子呢?(如果您不理解我的意思,我的意思是在每列、每行中输入什么数据…)例如,可能有一个带有学生ID的学生表,并且每天为每个学生在考勤表中创建一个新行,列1:学生ID,列2:日期,列3:状态(出席/缺席)。然而,这似乎不是很有效。你觉得怎么样


更新:从所有这些最初的答案来看,学生出勤表中的每一行似乎都有一个学生(他/她被指定为出席/缺席),但是如果我在每一行中包括一个以上的学生id,比如说某一天所有缺席的学生,该怎么办?这是更好还是更糟(可能是模棱两可的)?事实上,我开始认为效率会降低,因为这一举措所帮助的唯一行动已经很容易完成了。嗯…

我会有一张表,上面有一个表MissedClasses,其中StudentID作为外键,日期、课程,可能还有句号,可能还有另一个列表示是否可以原谅。如果他们没有参加,就写一个条目


我的理由是:希望大多数人都会参加大部分课程,所以你只需要记录未参加的课程。

我会有一个学生表,上面有学生id和每个学生的具体信息,如姓名、年级等。然后有一个学生出勤表,上面有学生id、日期、状态(出席/缺席)

虽然这确实收集了大量数据,但实际上并没有那么多数据,而且它允许您非常轻松地运行关于出勤率的多种报告

您不希望在一行中放置多个学生id,因为虽然您的行数较少,但数据量也会相同,查询表/报告会很麻烦。

STUDENTS
table
  • 学生ID
    ,主键
  • 名字
  • 姓氏
学生出勤率
  • 学生ID
    ,主键,fk
  • 缺席日期,主键
不需要
IS_缺席
列-有日期表示学生缺席以及缺席日期。缺席的天数可能少于出席的天数,因此只存储缺席日期

将主键设置为两列的组合键可以确保不会有重复项

如果我每行包含一个以上的学生id,比如说某一天缺席的所有学生,该怎么办?这是好还是坏

然后,您可以将额外的学生id存储为单个列中的逗号分隔列表,或者为每个额外的学生id存储额外的列。为每个学生id添加额外的列永远不会起作用-您将每年为每个新学生添加一列。连接一个学生ID列表更现实,但是如果你想报告一个特定的学生或一组学生的详细信息,那么将是一件痛苦的事情。由于字符限制,它可能无法存储可能缺少的每个学生id(只有一列)


我建议使用我建议的
学生出勤率
表。

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

这看起来有点过分,但学校里发生的几乎每件事都涉及到日程安排,所以日历是必不可少的。您最好尽可能多地使用它,以构建最佳模型


还要考虑学生缺课表需要的其他属性。在我的脑海中,你可能会想知道如何记录缺勤是否提前通知(例如,学期期间的家庭假期),缺勤是否被批准,缺勤是否是由于疾病造成的。

如果你将多个值合并到一个值列表中,并将其存储在一个单元格中,那么你的表就不再是第一个正常形式,正如Codd最初定义的那样。通过在表中存储一个表,您可以遵循按日期重新定义的第一个标准形式。大多数新手不会这么做。它们通常将值列表合并成逗号分隔的字符串,并将整个列表作为单个原子值进行存储

他们后来发现,他们不能再利用关系运算符(尤其是联接)的功能,以简单的方式表示复杂的操作。这通常会使新手付出比“低效率”更高的代价。即使您将一个表放在一个表中,您也会发现处理数据的日常工作比必须要困难得多

您得到的大多数好建议都涉及到分解表以实现规范化模式。这通常是您要遵循的最佳计划,直到您在以后的某个时间了解到何时打破规范化规则以及何时遵循这些规则

这不是为一个典型的12岁孩子写的。你听起来不像一个典型的12岁小孩。因此,我试图让您了解良好数据库设计的基础知识,而不是让您学习ba