iT邦幫忙

0

mysql 資料庫設計

各位大大好:

想請問 若我想要一堂課在星期五的567節都有資料,那資料庫或者語法要怎麼設計呢,我目前設計如下:
如果要567節,就要同一堂課列三次資料,ctime再區分5、6、7
https://ithelp.ithome.com.tw/upload/images/20180426/200970574Bmefrh4bU.png
https://ithelp.ithome.com.tw/upload/images/20180426/200970574QloPH3Tll.png

0
froce
iT邦大師 5 級 ‧ 2018-04-26 15:56:49
最佳解答

我會這樣設計啦,供參考:
1.一張資料表存課堂資料。
資料表應該會長像這樣(用逗點分隔比較好解析):

課程名稱   1       2       3       4       5       6       0    課程代號
XX課      5,6,7                   3,4                          00123
OO課              1,2,3                   3,4                  00456

2.一張資料表存學生選課資料。

學生姓名     課程代號
AAA         00123
AAA         00456

3.後端收到request後,運算出期間內學生修課,產出JSON供前端解析。
我應該會先產生該名學生週內課程的HASH表,然後產出。
JSON應該長的會像這樣:

[
    {date:"2018/1/1", weekday:"1", lesson:["","","","","XX課","XX課","XX課",""]},
    {date:"2018/1/2", weekday:"2", lesson:["OO課","OO課","OO課","","","","",""]},
    ...
]

4.前端解析。

所以最困難的應該是3的部份,如果還要加上調課的邏輯,就還需要一張表來處理。

看更多先前的回應...收起先前的回應...
mayyola iT邦新手 2 級 ‧ 2018-04-26 17:09:15 檢舉

謝謝f大~我大概也寫好了:)

這樣設計對嗎? /images/emoticon/emoticon04.gif

froce iT邦大師 5 級 ‧ 2018-04-27 09:31:17 檢舉

做的出來就是對的,要不然就請你發表一下你的高見。

mayyola iT邦新手 2 級 ‧ 2018-04-27 09:53:20 檢舉

我是降設計大概類似第一點
https://ithelp.ithome.com.tw/upload/images/20180427/20097057X88lBRY7ca.png

 echo '</tr>';
 for ($x=1;$x<=9;$x++){
 echo '<tr>';
 for ($i=0;$i<=6;$i++)
if($i!=0){
echo '<td>';
$sql2="select * from EC6023 where weekday=:Weekday";
$sqlr =$connr->prepare($sql2);
$ar_val1=array('Weekday'=>changeDay($i));
if($sqlr->execute($ar_val1)){
while ($course=$sqlr->fetch())
{
$s=(string)$x;
if(strpos($course['ctime'],$s)!==false)
echo $course['classname'].'<br>'.$course['teacher'];
else
echo "";
   }
   }
'</td>'; 
 }
  else{
  echo '<td>'. classnum($x).'</td>
 }
 }
 echo '</tr>';
 }

沒什麼高見,只是基本的3NF正規化和考慮資料新增、刪除、修改,會這樣設計就表示沒有理解資料庫設計的意涵而已,花個幾小時去了解一下,就會知道在說什麼了~/images/emoticon/emoticon28.gif

0
暐翰
iT邦大師 1 級 ‧ 2018-04-26 11:11:55

課表不是應該要綁日期嗎?
因為多周顯示問題 + 課程可以調班
還是設計只顯示當周課表?

這兩種的資料庫設計方式不一樣喔

mayyola iT邦新手 2 級 ‧ 2018-04-26 11:45:20 檢舉

只是設計周課表,我剛把ctime改成567節數跟$x為6用字串比對,但不知道為什麼比對不出來..
https://ithelp.ithome.com.tw/upload/images/20180426/20097057aZzmMRdwmp.png

$d=$course['ctime']; //假設$d=567     
if(strpos($d,$x)!==false) //$x=6
 echo $course['classname'].'<br>'.$course['teacher'];
  else
    	 echo "hihi";   
  for ($x=1;$x<=9;$x++){
	 echo '<tr>';     
     for ($i=0;$i<=6;$i++)    
	 if($i!=0){
     echo '<td align="center">';       
     $sql2="select * from EC6018 where weekday=:Weekday"; 
     $sqlr =$connr->prepare($sql2); $ar_val1=array('Weekday'=>$i);//sql叫出資料語法
if($sqlr->execute($ar_val1)){
while ($course=$sqlr->fetch()){                      $d=$course['ctime'];                      
if(strpos($d,$x)!==false)
echo $course['classname'].'<br>'.$course['teacher'];
else
echo "hihi";
   }
   }
    '</td>'; 
   }                
   }
		                    
		                    
mayyola iT邦新手 2 級 ‧ 2018-04-26 14:16:58 檢舉

已修正~謝謝

0
浩瀚星空
iT邦大師 1 級 ‧ 2018-04-26 11:49:02

這其實是要看你的規劃來決定你要的東西。

1.如果是屬於資料單一節計算的方式。
那就維持你目前的資料表架構。只是資料要用三筆來呈現567節。

2.但如果是範圍式的做法。那你的程式就得要改變一下。並將ctime改成範圍性的值。如5-7

3.另一種做法,則是將課程跟時間分開不同表處理。配合第一種做法也行。

但還是要可以先明白清楚你的規劃是如何的才行。

mayyola iT邦新手 2 級 ‧ 2018-04-26 12:16:39 檢舉

浩瀚星空您好:
我剛想要用法2,將ctime改成567,但是要跟$X(列)比對(用strpos),code就無法比對..還在找原因

你不該從sql下手。你該從你的程式碼下手才對。
從sql下手的話。我倒是建議你用第1種方式,會比較符合你想要的做法。
補充一下,無論你打算怎麼做。三筆資料是不可避免的事。
重點在於你要從sql內的資料就產生,還是要從程式內產生而已。

mayyola iT邦新手 2 級 ‧ 2018-04-26 17:09:31 檢舉

謝謝你~已經完成了:)

我要發表回答

立即登入回答