这么设计数据库合适吗

这样设计数据库合适吗?
主表字段 
学号,姓名,性别,经手人,教师 

经手人表
编号,经手人姓名

教师表
编号,教师姓名

请问:保存到主表 经手人 和 教师 字段 的数据是 保存 编号 还是 姓名合适?
我目前都会保存姓名,这样的话统计的SQL会容易写一点。

还有学生考试表我也是把全部需要的数据都保存到一起,比如
学号,姓名,性别,教师,考试成绩 等



还有我每张表都设置了一个自增的主键来防止出现完全一样的记录,这样做是否可行?

分不多还请各位帮帮忙
------解决方案--------------------
引用:
主表字段 
学号,姓名,性别,经手人,教师 

经手人表
编号,经手人姓名

教师表
编号,教师姓名

请问:保存到主表 经手人 和 教师 字段 的数据是 保存 编号 还是 姓名合适?
我目前都会保存姓名,这样的话统计的SQL会容易写一点。

还有学生考试表我也是把全部需要的数据都保存到一起,比如
学号,姓名,性别,教师,考试成绩 等



还有我每张表都设置了一……


可以
使用编号,当更改姓名的时候,不至于导致数据无法对应的情况发生。
------解决方案--------------------
看业务模型,如果学生和经手人、老师是多对多的关系,则信息需要用中间表存储。这样后期做数据统计可能会更有利一些。

1.学生表
2.经手人表
3.教师表
4.学生-经手人中间表
5.学生-教师中间表
------解决方案--------------------
我觉得大家都说得不够专业
每一个数据表最好建一个独立的ID作为主键
比如
ID,学号,姓名,性别,教师
经手人表 
ID,经手人ID,姓名
经手人ID=主表中的ID
一般建数据表,都不建议采用不重复的数字编号作为主键,因为数字编号本身就存在长度、位数等不
可定因素的影响,所以每一个数据表都建议采用ID varchar(50)来建立
插入数据库的时候 ID=GetGuid;
函数如下: 
function GetGUID:string;
var
  AGUID : TGUID;
begin
  CoCreateGuid(AGUID);
  Result := GUIDToString(AGUID);
end;

单元引用 ComObj,ActiveX