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