一个实验室管理系统,假设有三个表:实验室,实验分室,实验教师。
实验室表名:Lab,数据列:实验室编号(ID),实验室名称(Name)。
实验教师表名:Teccher,数据列:教师编号(ID),教师姓名(Name)。请大家看看,在设计数据列名时,是否需要把数据列的含义写完整,还是可以把表名的内容省略掉呢。
如:
实验室编号是用:ID,还是用:LabID。
实验室名称是用:Name,还是用:LabName。
教师姓名是用:Name,还是用:TeacherName。
实验室表名:Lab,数据列:实验室编号(ID),实验室名称(Name)。
实验教师表名:Teccher,数据列:教师编号(ID),教师姓名(Name)。请大家看看,在设计数据列名时,是否需要把数据列的含义写完整,还是可以把表名的内容省略掉呢。
如:
实验室编号是用:ID,还是用:LabID。
实验室名称是用:Name,还是用:LabName。
教师姓名是用:Name,还是用:TeacherName。
实验室名称是用:Name,还是用:LabName。
教师姓名是用:Name,还是用:TeacherName。
比如TeacherName表示老师的名字,LabName表示实验室的名字。
如果都用Name的话,光看到这个Name,还要参考上下文才知道指的是什么的名字,在写代码时增加思考的时间,也更容易出错。
需要错开关键字、保留字。
如果一个表是Teacher,那么这个表里的Name就是Teacher Name,再加Teacher显得多余。
至于楼上说的参考上下文才知道是什么Name,我想写代码的时候,你自己应该清楚自己在写什么,问题不是很大。比如说ID,大家应该都不会写成TeacherID,StudentID,而是ID,我想Name其实也同样如此。当然了,原则是原则,如果你遵循需要加前缀,这本身也没什么错。只不过如果加的话,应该都加,而不是部分加,部分不加。个人感觉跟写代码规范差不多吧,用pascal还是camel,是个喜好问题。
coding时自己别人也都明白些。这对程序运行没什么影响吧
恰恰相反。我都是宁可写成TeacherID、StudentID,而不是ID。比如下面几段代码,功能是根据指定课程ID查询该课程的任课老师和选课的学生。--完整字段名
SELECT
c.CourseID, c.CourseName, t.TeacherName,
s.StudentID, s.StudentName
FROM Course c
INNER JOIN Teacher t
ON c.TeacherID = t.TeacherID
INNER JOIN ChooseCourse cc
ON c.CourseID = cc.CourseID
INNER JOIN Student s
ON cc.StudentID = s.StudentID
WHERE c.CourseID = @CourseID--简单字段名
--使用表别名
SELECT
CourseID = c.ID, CourseName = c.Name, TeacherName = t.Name,
StudentID = s.ID, StudentName = s.Name
FROM Course c
INNER JOIN Teacher t
ON c.TeacherID = t.ID
INNER JOIN ChooseCourse cc
ON c.ID = cc.CourseID
INNER JOIN Student s
ON cc.StudentID = s.ID
WHERE c.ID = @CourseID
--不使用表别名
SELECT
CourseID = Course.ID, CourseName = Course.Name, TeacherName = Teacher.Name,
StudentID = Student.ID, StudentName = Student.Name
FROM Course
INNER JOIN Teacher
ON Course.TeacherID = Teacher.ID
INNER JOIN ChooseCourse
ON Course.ID = ChooseCourse.CourseID
INNER JOIN Student
ON ChooseCourse.StudentID = Student.ID
WHERE Course.ID = @CourseID
我一向都是使用第一段代码,即完整字段名。我们来看如果使用简单字段名的情况:
1. 使用表别名:你的代码将充满大量的ID、Name,你要区分每一个ID和Name指的是什么的ID和什么的Name,以此来指定正确的表别名;还要区分何时带前辍(外键字段)何时不带前辍(主表字段)。假如某个表别名写成了另一个表的别名,则数据库引擎不会报任何错,它只是乖乖地返回不是你所想要的结果。逻辑错误比语法错误更讨厌。
2. 不使用表别名:你的代码将会变成一个数“.”在什么位置的游戏,即什么时候表名与字段名中间要加“.”什么时候不用加。而且这样的代码丝毫没有简略性可言。它相比于第一种代码的优势何在呢?
c.CourseID, c.CourseName, t.TeacherName,
s.StudentID, s.StudentName
FROM Course c
INNER JOIN Teacher t
ON c.TeacherID = t.TeacherID
INNER JOIN ChooseCourse cc
ON c.CourseID = cc.CourseID
INNER JOIN Student s
ON cc.StudentID = s.StudentID
WHERE c.CourseID = @CourseID表示同一个概念的字段,在主表和参照表(通过外键引用主表的表)中是同样的名字。这样,程序员就明白让相同名字的字段去JOIN永远不会错(或许结果不符合查询要求,但至少是有意义的;而教师的ID与课程的ID去JOIN则是无意义的),而不是在JOIN的时候还要考虑这个ID应该从哪个表中来。类似,当程序员看到一些数据时:TeacherID ID
--------- ------
T000001 000001
T000002 000002
T000003 000003左边的数据,一看便知是教师的编号;而右边的数据,如果没有相关上下文,便是一组无意义的编号。
更多建议,参考《SQL编程风格》一书。
其他的就不带了
如同 OO设计一个对象 人的时候 定义属性 人手 人脚
本来在查询中使用中都已经很明确了
感谢跟帖回复的各位大大。
学到了很多。
散分!!
世界杯快乐!!