Php 选择处理出勤的表格

Php 选择处理出勤的表格,php,database,database-design,database-schema,Php,Database,Database Design,Database Schema,我正在用PHP[处理学生出勤系统]做我的项目。我有一个学生列表以及他们的id[jntuno],我需要在mysql中创建一个数据库,用于存储每个学生在每个学科的每日出勤情况。因此,我以以下方式创建了我的表: 表:学生 字段: slno int(5) auto increment, jntuno char(15), name char(50), primary key(slno,jntuno). date date, subject char(10), classesconducted int(2

我正在用PHP[处理学生出勤系统]做我的项目。我有一个学生列表以及他们的id[jntuno],我需要在mysql中创建一个数据库,用于存储每个学生在每个学科的每日出勤情况。因此,我以以下方式创建了我的表:

表:
学生

字段:

slno int(5) auto increment,
jntuno char(15),
name char(50),
primary key(slno,jntuno).
date date,
subject char(10),
classesconducted int(2),
`11341A0501` int(2),
`11341A0502` int(2),
`11341A0503` int(2),
.
.
.
`11341A0537` int(2),
primary key(date,subject).
数据:

students
表包含学生列表及其id

现在我创建了另一个表:

表:
dailyatt

字段:

slno int(5) auto increment,
jntuno char(15),
name char(50),
primary key(slno,jntuno).
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网站上输入出勤率后,每天都会为当天教授的每个科目创建一个新行

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


有人能给我推荐一个更好的模型来解决这类问题吗?

你为每个学生都创建了一个专栏,我认为这是件坏事

为什么不创建这样的表呢

`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月06日,slno#1(11341A0501)的学生获得slnoconducted==5,描述为“A级”

之后,如果您希望(例如)获取今天的所有记录,可以使用查询:

SELECT * FROM dailyatt WHERE `date` = '2013-10-06'
SELECT * FROM dailyatt WHERE `slno` = 1
如果要获取一个学生的所有记录,可以使用查询:

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'
这是处理记录的更好方法。如果您将为每个学生创建列,您将失去数据库的灵活性,因为在
students
表中进行任何更改后,您必须创建/删除另一列


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

你为每个学生都创建了一个专栏,我认为这是件坏事

为什么不创建这样的表呢

`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月06日,slno#1(11341A0501)的学生获得slnoconducted==5,描述为“A级”

之后,如果您希望(例如)获取今天的所有记录,可以使用查询:

SELECT * FROM dailyatt WHERE `date` = '2013-10-06'
SELECT * FROM dailyatt WHERE `slno` = 1
如果要获取一个学生的所有记录,可以使用查询:

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'
这是处理记录的更好方法。如果您将为每个学生创建列,您将失去数据库的灵活性,因为在
students
表中进行任何更改后,您必须创建/删除另一列


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

想象一下你们学校有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 

想象一下你们学校有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 

您应该学习数据库规范化()并理解为什么在操作系统中使用至少为第三正常形式(3NF)的数据库存储事务数据是最佳做法,除非您有明确的理由不这样做。您应该学习数据库规范化()并理解为什么在操作系统中使用至少为第三范式(3NF)的数据库存储事务数据是最佳做法,除非您有明确的理由不这样做。