Re: [SQL ] 有兩個資料表設計的問題
正規作法:
Table student
id name
名稱
Table class
id name date
名稱 上課日期
Table class_list
id student_id class_id
學生編號 選的課程id
找學生選了哪些課:
SELECT * FROM class_list, class
WHERE class_id=class.id AND student_id=學生編號
找課程中有哪些學生:
SELECT * FROM class_list, student
WHERE student_id=student.id AND class_id=課程編號
如果你打算用課程或是學生的名字去找,那還得多關聯一張表才行
偏門:
Table student
id name class_list
名稱 ;2;6;8;
↑
課程表,注意前後都要有分隔符號
Table class
id name date student_list
名稱 上課日期 ;6;8;9;
課程的學生列表
Table class_list
id student_id class_id
學生編號 選的課程id
然後記得在編輯過class_list之後
要去寫入student.class_list跟class.student_list欄位
找課程中有哪些學生:
SELECT * FROM student WHERE class_list LIKE '%;課程id;%'
找學生選了哪些課:
SELECT class_list FROM student WHERE id=學生id
如果要用名稱的話,才用正規的方式去關連資料出來
注意:考試或是做學校專題時,記得用正規方法,不然會被噹到死
效率這種東西有時候是可以「搬移」的
像那種偏門方法就是「降低寫入降低效能,加快讀取效能」
如果常常用到名字的話,還可以把id、名稱弄成json,存進欄位
但相對的,當資料有變動時就更需要花工夫去修改或是同步
對這種資料庫設計不熟的人,去寫update的sql說不定還會把資料弄亂.....
總之,如果有下面這些行為的話
依照順序,盡量避免掉:
1.用程式遞迴查詢
遺憾的是,有些樹狀結構的資料表無法避免這種狀況....
2.用迴圈查詢
80%的狀況都可以把迴圈壓縮到 WHERE 的條件中
3.IN (..程式撈資料庫黏字串出來的落落長的清單..)
用子查詢來做說不定會好一點
總之最好也不要用
簡單來講,就是盡量避免大量下SQL去撈資料的狀況。
※ 引述《xfighter (xfighter)》之銘言:
: 最近在做的東西愈到了一些瓶頸, 想請問大家資料庫的table該怎麼設計會比較有效率:
: case1:
: 有n個學生, 有m種課程
: 學生 課程
: 1 1(數學)
: 2 2(國文)
: 3 .
: 4 .
: . .
: . m
: .
: n
: 應用是要知道每個學生選了哪些課程
: table要怎麼設計, 效率會比較好呢?
: 我目前的做法是:
: 學生table:
: -----student-----
: | ID | name | my_lessons |
: | 1 | John | 1;3;6 |
: | 2 | Jack | 4;5;6 |
: | . | . | . |
: | . | . | . |
: | n | . | . |
: 課程table:
: ----lession------
: | lesson_ID | lesson_name |
: | 1 | 國文 |
: | 2 | 數學 |
: | . | . |
: | . | . |
: | m | . |
: 要拿到每個學生在上的課程, SQL語法:
: $list = student's my_lessons
: $result = mysql_query("SELECT * FROM `lesson` WHERE `lesson_ID` IN ($list)");
: 這種多對多的table一但資料庫太大, 效率就會很差...
: 不知道版上大大們可否給小的一些建議
: case2.
: 每一堂課的留言版要怎麼設計會比較有效率呢
: 課程table:
: ----lession------
: | lesson_ID | lesson_name |
: | 1 | 10/25 國文 |
: | 2 | 10/27 數學 |
: | . | 10/30 國文 |
: | . | . |
: | . | . |
: 留言內容table:
: ----message------
: | message_ID | lesson_ID | message |
: | 1 | 1 | 今天國文好難 |
: | 2 | 1 | 國文真是我的罩門 |
: | 3 | 2 | 我喜歡數學 |
: | . | . | . |
: | . | . | . |
: 要拿到每堂課程的留言, SQL語法:
: $lession_ID = lession's lesson_ID
: mysql_query("SELECT * FROM `message` WHERE `lesson_ID` = '$lession_ID'");
: 然後每堂課都要執行一次..去撈所有的message table
: 這樣會不會太暴力? 謝謝..^^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.36.3
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):