小弟新手 对数据库外键总是有些疑惑 向各位老大请教
举个例子 我设计一个学生表 具体的外键是该设计成班级号呢 还是 设计成班级名
一个学生表: int id(主键)、char 姓名 、int 班级号、班级号是班级表id的外键
一个班级表:int id(主键)、char 班级名下面我设计的学生表中 设计的是班级名 和班级表的标记名设计成外键关系
一个学生表: int id(主键)、char 姓名 、char 班级名、班级名是班级表班级名的外键
一个班级表:int id(主键)、char 班级名(索引)这两种表哪一种设计好 
我想我在select学生的信息时 一般直接能获取到班级名不是更好吗 如果是第一种设计 那么学生信息中的班级号是个id 还得再班级表中再查
但貌似教科书中的大部分设计成id为外键关联 
还有个问题 对于delete和update的约束 一般设计成限制还是层叠 设计成限制 那么班级就不能随意删除 二设计成层叠 班级名的修改会连带到学生表中 呵呵 特别是如果学生数据量较大 在select查询时 这两种外键的设计会不会导致效率差距很大
呵呵 问的基础了 请各位赐教

解决方案 »

  1.   

    外键一般是课程id 班级id 学号sno等。
      

  2.   

    1.如果班级名不可能有重复的,而且班级名的存储字节数并不比 int 长,那直接用班级名作班级表的主键和学生表的外键也无不可.
    2.最好设置成限制,否则可能由于误删除而损失有用的数据.不过这种设置与查询效率无关.
      

  3.   

    谢谢各位的指点 
    我主要是想 我编程操作的时候 比如要列表 将学生逐个排列
    当然是这样的形式
    1 张三 高一三班
    2 李四 高二四班
    3 王五 高三四班 
    最后的班级肯定想列出班级的名字
    第一种用id的外键方式 那我怎么列出编辑的名字呢 
    我select 所有的学生信息后 势必还要去再更具学生信息的id 去查班级名吧 
    是不是这样
    那为什么教科书上 总把id作为外键 就是因为id默认主键和索引 如果设计班级名为外键必须添加索引吗
    这两种有什么区别 再效率上谁有优势 
    为什么总是说 当然是用班级号来做外键了  
    小弟不明白啊 再次谢谢
      

  4.   

    学生表里有班级表的id和班级表里有学生的id你觉得哪个容易维护?
    学生必有班级,但是班级里未必有学生,查询的时候学生表left join 班级就得到班级名字了。
    你班级表里放学生ID,打算放多少学生的ID?
      

  5.   


    谢谢大家的指教 
    这么说 主要考虑到数据冗余上 如果班级名也就是高一三班 高二四班这样的四个中文字符 用班级名作外键也是可以的 但肯定要把班级名字段升级为索引 
    还想深问一点
    如果这个学生表很庞大 数据字段也很多 再比如一个学生表: int id(主键)、char 姓名 、char班级名、char 实验室名、char 兴趣小组名、char 科研小组名 等等
    这些 班级名 实验室名 兴趣小组名 科研小组名 等等 都是其他表的外键 当然这些外键都是唯一的 而且字段也都几个中文字 
    但如果都拿名作为外键 势必需要把这些名升级为索引 
    如果外键很多 如上述情况下 再拿名字作为外键 这些索引会影响查找的效率吗这类
    或是有什么其他影响
    大部分看都拿id作为外键 因为id都是默认主键和索引 呵呵
     
      

  6.   

    都一样.
    不过,请注意数据类型的长度:
    tinyint 1 字节  最大容纳 255
    smallint 2字节  最大容纳 32767
    int 4字节
    nvarchar(4) 8字节
    假如兴趣小组要10个汉字,那就是20字节!