作者LaPass (LaPass)
看板Database
标题Re: [SQL ] 有两个资料表设计的问题
时间Wed Dec 25 18:03:31 2013
正规作法:
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