数据库一对多的表如何设计呢?

lisency 2012-07-27 03:29:07
对于教师表,会有这些属性:教师号,职称,职务,所带课程
这里一个老师可以带好多课程,如何在数据库里面存这些课程号呢?
一个字段只能存一个课程号,那么对于多个课程如果多次存教师号,职称,职务这三个字段会造成极大的空间浪费,那么这个课程字段该怎样设计好呢?
...全文
6218 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
淡莣_ 2014-11-12
  • 打赏
  • 举报
回复
<a href="www.baidu.com">baidu</a>
lisency 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

查到了吗?你根据我说的去设计一下数据库,应该是没有压力的。
[/Quote]

这个属于完整性问题,我觉得我遇到的应该是规范化问题
lisency 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

不会,因为建索引了。
索引你可以理解为array的下标。取a[0001][]这样的操作是很快的。
[/Quote]
数据库会自动建立这样一个索引吗,如果是这样的话,我纠结了半天的问题可真就没含量了
aopha 2012-07-28
  • 打赏
  • 举报
回复
不会,因为建索引了。
索引你可以理解为array的下标。取a[0001][]这样的操作是很快的。
lisency 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

老师表:
老师ID 老师姓名 职称 职务...

其中老师ID是主键(Primary Key)

课程表:
课程ID 老师ID 课程名称...

其中课程ID是主键,老师ID是外键(Foreign Key,需要参考老师表.老师ID)



数据表结构设计,绝大部分情况下是有冗余的,没有冗余的情况不太容易做到,即使做到了,那么开发的人肯定会死去活来的。因为这样的原因,在实践……
[/Quote]
按照这样设计的话,那么如果要查询id为0001所带的所有课程的课程号的话,是不是意味着每查询一次就需要遍历整个表呢?而这个表比较大的话是不是代价会特别大?
pathuang68 2012-07-27
  • 打赏
  • 举报
回复
楼主如果这方面有兴趣,最好去下载一个ERWin之类的设计工具,多试试就会了。
pathuang68 2012-07-27
  • 打赏
  • 举报
回复
老师表:
老师ID 老师姓名 职称 职务...

其中老师ID是主键(Primary Key)

课程表:
课程ID 老师ID 课程名称...

其中课程ID是主键,老师ID是外键(Foreign Key,需要参考老师表.老师ID)



数据表结构设计,绝大部分情况下是有冗余的,没有冗余的情况不太容易做到,即使做到了,那么开发的人肯定会死去活来的。因为这样的原因,在实践中很少用到超过3NF的范式。

数据库范式,看起来好像很简单,其实要理解清楚还是有点难度滴,哥曾经写过一篇文章,试图用简单、实际的例子来说明1NF,2NF和3NF。详见:
数据库范式问题
diablox0147 2012-07-27
  • 打赏
  • 举报
回复
多对多,当发生像LZ这样的情况,表A的元素对应多个表B的元素,表B也同样对于表A的多个元素时,就把2个表的key拿出来做个新的表。
这里可以这么做:
弄个新的表将课程对应提取出来单独储存,带有教师的ID和课程的ID,之后还可以加入一些时间,描述之类的项。 这样就连接了教师表和课程表 而不用对这2个表有任何的修改
漫步者、 2012-07-27
  • 打赏
  • 举报
回复
查到了吗?你根据我说的去设计一下数据库,应该是没有压力的。
lisency 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

那是数据库设计问题不是C++问题,郁闷
[/Quote]

我是觉得C++版高手多嘛
ziwei55 2012-07-27
  • 打赏
  • 举报
回复
那是数据库设计问题不是C++问题,郁闷
lisency 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

根据你的描述,你要么分两个表,一个存放教师的信息,一个存放课程的信息,两个表中都有教师号,把教师表中的教师号设置为主关键字,课程表中的设置为外部关键字就行了。能满足你的要求,。如何存放这些数据是根据的你的表的设计来存放的。
[/Quote]
设置外部关键字?没听说过呢?让我查查。
漫步者、 2012-07-27
  • 打赏
  • 举报
回复
根据你的描述,你要么分两个表,一个存放教师的信息,一个存放课程的信息,两个表中都有教师号,把教师表中的教师号设置为主关键字,课程表中的设置为外部关键字就行了。能满足你的要求,。如何存放这些数据是根据的你的表的设计来存放的。
yandong 2012-07-27
  • 打赏
  • 举报
回复
在设计的时候,把这种情况考虑为多对多的形式,不要具体的考虑如何实现的问题。在设计完成的时候,需要进行规范化(如第一范式,第二范式等等)。 对于你这个问题你需要将“多对多”的模式转化为“一对多”的形式。 建议搜一搜数据库设计的步骤以及数据库规范化。

64,690

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧