Re: [SQL ] 有兩個資料表設計的問題

作者: LaPass (LaPass)   2013-12-25 18:03:31
正規作法:
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:
:

Links booklink

Contact Us: admin [ a t ] ucptt.com