我正在开发我的PHP项目[处理学生出勤系统]。我有一个学生列表以及他们的id [jntuno],我需要在mysql中创建一个数据库,用于存储每个学生每个学生的每日出勤率。所以我用这种方式创建了我的表:
表:students
字段:
slno int(5) auto increment,
jntuno char(15),
name char(50),
primary key(slno,jntuno).
DATA:
此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网站后,将为当天教授的每个科目创建一个新行。
但是很多人说数据库模型不是很好...
这个数据库结构有什么问题?
那么有人可以建议我为这类问题找一个更好的模型吗?
答案 0 :(得分:3)
图片显示,您的学校有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
答案 1 :(得分: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-06之前,具有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'
这是处理记录的更好方法。如果您要为每个学生创建列,您将失去数据库的灵活性,因为您必须在students
表中的任何更改后创建/删除另一列。
我希望我能正确描述,因为我不确定我的英语水平如何。