2013-10-06 37 views
0

我正在使用PHP [處理學生考勤系統]處理我的項目。我有一個學生名單及其ID [jntuno],我需要在mysql中創建一個數據庫,用於存儲每個學生每個學生的每日出勤情況。因此,我通過這種方式創建了我的表格:處理考勤表的選擇

TABLE:students

字段:

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

DATA:

Data in students table

這種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

你應該學習數據庫標準化(http://en.wikipedia.org/wiki/Database_normalization),並瞭解爲什麼它是使用數據庫是存儲在業務系統的交易數據最好的做法至少第三範式(3NF),除非你有特殊的理由不要。 –

回答

3

圖片你有200學生在你的學校提供​​。你的第二張桌子上會有200多列。你應該把它分成兩個表格。一個用於在學校提供的所有課程,另一個用於實際考勤記錄。

「類」 表

enter image description here

「考勤表」

enter image description here

然後它們連接在一起。

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' 

這是更好的方式來處理記錄。如果您要爲每個學生創建專欄,您將失去數據庫的靈活性,因爲在students表中發生任何更改後,您將不得不創建/刪除另一列。

我希望我能正確描述它,因爲我不確定自己有沒有好的英語。