p; ( "ID" CHAR(4), "名称" CHAR(16), PRIMARY KEY ("ID"), )
CREATE TABLE "教师信息" ( "ID" CHAR(4), "姓名" CHAR(16), "课程ID" CHAR(4), PRIMARY KEY ("ID"), FOREIGN KEY("课程ID") REFERENCES "课程信息"("ID") )
CREATE TABLE "成绩信息" ( "学生ID" CHAR(4), "教师ID" CHAR(4), "课程ID" CHAR(4), 成绩 NUMERIC(5, 2), PRIMARY KEY("学生ID", "教师ID", "课程ID"), FOREIGN KEY("学生ID") REFERENCES "学生信息"("ID"), FOREIGN KEY("教师ID") REFERENCES "教师信息"("ID"), FOREIGN KEY("课程ID") REFERENCES "课程信息"("ID") )
这样建表很明显是为了尽可能的细化信息的分类。它的好处在于各种信息分划明确,不 过问题也很明显,比如,一个教师不能同时带两门不同的课(当然,这可能正是业务规则所 要求的),而且,这样做分类过于细腻了。
如果不需要对教师进行人事管理,那么,完全可以把教师信息和课程信息合为一表。也就是说,不同教师带的同 一名称课程,视做不同课程。这样做当然也有其应用背景,很多教师,特别是高等教育和名师,往往有他们自 己的风格,完全可以视做两种课程,相信同样教授 C++ , Lippman 和 Stroustrup 教出的学生总会有所不同。 要说问题,那就是,如果想要限制学生不能重复修某一门课,就得用触发器了,没有太好的办法,不过这个问题, 前面的第一种设计同样解决不了,就算针对教师和课程的关系单建一个表也不一定就可以,还把问题复杂化了。 现在把第二种设计的脚本列出来:
CREATE TABLE "学生信息" ( "ID" CHAR(4), "姓名" CHAR(16), PRIMARY KEY ("ID") )
CREATE TABLE "课程信息" ( "ID" CHAR(4), "课程分类" CHAR(4), "名称 "CHAR(16), "教师ID" CHAR(4), "教师姓名" CHAR(16), PRIMARY KEY ("ID") )
CREATE TABLE "成绩信息" ( "学生ID" CHAR(4), "课程ID" CHAR(4), 成绩 NUMERIC(5, 2), PRIMARY KEY("学生ID", "课程ID"), FOREIGN KEY("学生ID") REFERENCES "学生信息"("ID"), FOREIGN KEY("课程ID") REFERENCES "课程信息"("ID")- )
这样是不是能清爽一点?这样一来,如果不存在一个教师教不同的课程的情况,并且我 们希望简化管理,甚至都可以不用"课程分类"和"教师ID"字段。当然,视业务需要而定, 如果希望在限制学生学习的课程分类的同时,不想带来额外的性能开销,使用第一种设 计,或将课程分类字段也列入成绩信息表,是一个更好的办法。
关于数据库的设计和管理,有几条经验,拿出来在这里和大家交流一下: 对数据进行规范化时,最好要符合它的应用背景。这样易于理解和管理; 数据的规范化不一定是越细化越好,粒度适当地大一点,后面的编程一般会容易一点; 虽说不是越细越好,不过要是不做规范化,却几乎是一定要出问题; 很重要的一点: 千万不要滥用自动标识列! 特别是,不要滥用自动标识列来做为一个表中唯一的约束条件,通常, 那和没有约束没什么不同!
关于这些试题,我们的看法就到这里,希望朋友们可以拿出更多更好的意见,我们一起讨论。
原题含答案: CREATE TABLE [T] ( [ID] [int] IDENTITY (1, 1) NOT NULL, [学生ID] [varchar] (50) NULL, [学生姓名] [varchar] (50) NULL, [课程ID] [varchar] (50) NULL, [课程名称] [varchar] (50) NULL, [成绩] [real] NULL, [教师ID] [varchar] (50) NULL , [教师姓名] [varchar] (50) NULL, CONSTRAINT [PK_T] PRIMARY KEY CLUSTERED ( [ID] ) ON [PRIMARY] ) ON [PRIMARY] GO
INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''S3'''',''''王五'''',''''K2'''',''''语文'''',81,''''T2'''',''''王老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''S3'''',''''王五'''',''''K4'''',''''政治'''',53,''''T4'''',''''赵老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''S4'''',''''赵六'''',''''K1'''',''''数学'''',99,''''T1'''',''''张老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''S4'''',''''赵六'''',''''K2'''',''''语文'''',33,''''T2'''',''''王老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''S4'''',''''赵六'''',''''K4'''',''''政治'''',59,''''T4'''',''''赵老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''s1'''',''''张三'''',''''K4'''',''''政治'''',79,''''T4'''',''''赵老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''s1'''',''''张三'''',''''K1'''',''''数学'''',98,''''T1'''',''''张老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''s1'''',''''张三'''',''''K3'''',''''英语'''',69,''''T3'''',''''李老师'''') INSERT INTO T ([学生ID],[学生姓名],[课程ID],[课程名称],[成绩],[教师ID],[教师姓名]) valueS (''''s7'''',''''peter'''',''''K1'''',''''数学'''',64,''''T1'''',''''张老师'''') INSERT INTO T ([学生ID],[ 上一页 [1] [2] [3] [4] [5] [6] 下一页 |