【问题标题】:Choice of tables for handling attendance处理考勤表的选择
【发布时间】:2013-10-12 23:49:46
【问题描述】:

我正在开发我的 PHP 项目 [处理学生考勤系统]。我有一个学生列表以及他们的 id[jntuno],我需要在 mysql 中创建一个数据库来存储每个学生对每个科目的每日出勤率。所以我以这种方式创建了我的表:

表:students

字段:

slno int(5) auto increment,
jntuno char(15),
name char(50),
primary key(slno,jntuno).

数据:

这个students 表包含学生列表和他们的ID

现在我创建了另一个表:

表:dailyatt

字段:

date date,
subject char(10),
classesconducted int(2),
`11341A0501` int(2),
`11341A0502` int(2),
`11341A0503` int(2),
.
.
.
`11341A0537` int(2),
primary key(date,subject).

这个表格看起来像:

+------------+-----------+-----------------+------------+-----------+-----------+
|date        |subject    |classesconducted |11341A0501  |11341A0502 |11341A0503 |....
+------------+-----------+-----------------+------=-----+-----------+-----------+
|            |           |                 |            |           |           |

现在每天在 PHP 网站上输入出勤率后,将为当天教授的每个科目创建一个新行。

但是很多人说数据库模型不好...
这个数据库结构有什么问题?

那么有人可以为我推荐一个更好的模型来解决这类问题吗?

【问题讨论】:

  • 您应该研究数据库规范化 (en.wikipedia.org/wiki/Database_normalization) 并理解为什么在操作系统中使用至少为第三范式 (3NF) 的数据库存储事务数据是最佳实践,除非您有特定的充分理由不这样做。

标签: php database database-design database-schema


【解决方案1】:

假设您的学校有 200 名学生。您的第二个表中将有 200 多列。你应该把它分成两个表。一个用于学校提供的所有课程,第二个用于实际出勤记录。

“类”表

“考勤表”

然后将它们连接在一起。

SELECT student_id, class_name, date, class_attended
FROM attendance AS ABB2
    LEFT JOIN classes AS ABB1 ON ABB1.id = ABB2.class_id 

【讨论】:

    【解决方案2】:

    你正在为每个学生创建一个专栏,我认为这是一件坏事。

    为什么你不创建这样的表?

    `date` date,
    `slno` int(5),
    `slnoconducted` int(2),
    `subject` char(10),
    primary key(`date`, `slno`, `subject`)
    

    因此,您可以在此表中插入一些值,例如:

    ("2013-10-06", 1, 5, "Class A")
    

    它将被视为:截至 2013 年 10 月 6 日,slno #1 (11341A0501) 的学生获得 slnoconducted == 5,描述为“A 级”。

    之后,如果你想获取今天的所有记录,你可以使用查询:

    SELECT * FROM dailyatt WHERE `date` = '2013-10-06'
    

    如果要获取一个学生的所有记录,可以使用查询:

    SELECT * FROM dailyatt WHERE `slno` = 1
    

    甚至:

    SELECT d.*, s.`jntuno`, s.`name` 
    FROM `dailyatt` d
    LEFT JOIN `students` s ON d.`slno` = s.`slno`
    WHERE `date` = '2013-10-06'
    

    这是处理记录的更好方法。如果您为每个学生创建列,您将失去 DB 的灵活性,因为您必须在 students 表发生任何更改后创建/删除另一列。

    我希望我描述的正确,因为我不确定我的英语是否良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多