日期:2014-05-16  浏览次数:20682 次

mysql建方面的多对多的实例原理该如何理解?
我在实际运用中,一对多是这样建的。

学生表:
学生id 学生姓名
1 张三
2 李四

考试表
自增ID 学生id 学科
1 1 语文
2 1 数学
3 2 语文
4 2 英语 


‘考试表’存储了‘学生表’的多条记录。我这样建立合理不合理呢?这样建合,我后面会产生二个问题,感觉不是很方便,大家有什么好的方式可以解决后面的这二个问题呢?
这二个表中的数据可能是上百万哦!


问题1:
在查询‘考试表’中考了语文和数学的学生姓名列出来。
我与的SQL是可以查询出来,不过效率不行,感觉这样建表是不是就是引起的这个查询问题呢?

问题2:
我这样建立一对多的方式是不是有问题?大家建立一对多是加了‘关系映射表’ 吗?有什么好处呢?

------解决方案--------------------
1 你的是什么语句 怎么知道效率不行
2 你的表没什么大问题,无非就是多加个学科表 考试表里的学科用学科表的id代替
------解决方案--------------------
看你有什么需求了,你的1对多也没什么问题
但是如果数据很多的情况下,还是有数据冗余的。
比如有1万学生考了语文,那么你的

考试表
自增ID 学生id 学科
1 1 语文
2 2 语文
3,3 语文
。。。。。

还有比如每个学生考了20科,一共有1万学生
对每个学生而言

 考试表
自增ID 学生id 学科
1 1 语文
2 1 数学
3,1 英语
........
直到1万学生完

你可以用另外一种方案


学生表:
学生id(主键) 学生姓名
1 张三
2 李四


考试表
考试id(主键) 学科
1 语文
2 数学
3 英语

这连个表中的数据不会有冗余,然后建立一个多对多的关系
学生id 和考试id 作为联合主键和外键,这样数据冗余会小很多。

SQL code

问题一的伪代码
select sname from student where sid in( select sid from multi-to-multi jion exam where ename=“语文” or ename="数学");

------解决方案--------------------
引用‘考试表’存储了‘学生表’的多条记录。我这样建立合理不合理呢?这样建合,我后面会产生二个问题,感觉不是很方便,大家有什么好的方式可以解决后面的这二个问题呢?
这二个表中的数据可能是上百万哦!

------解决方案--------------------
引用问题1:
在查询‘考试表’中考了语文和数学的学生姓名列出来。
我与的SQL是可以查询出来,不过效率不行,感觉这样建表是不是就是引起的这个查询问题呢?

------解决方案--------------------
引用问题2:
我这样建立一对多的方式是不是有问题?大家建立一对多是加了‘关系映射表’ 吗?有什么好处呢?