我接到了以下任务:
1部分:
你要设计一个架构(一些 表格)学生将拥有 id,name;一门课程会有id,name; 计划将有roomId,开始 时间;一个房间将有id,位置, 容量。
我构建了以下内容: 学生(varchar(10)PK id,first,last,courseId) - btw我认为最好添加一个enumertion(identity)列并在PK下调用这个列+ id列 - 所以每个可能有多行学生(每个人都参加另一门课程)
课程(varchar(10)PK id,name)
计划程序(FK到课程CourseId,FK到课程RoomId,日期日期,时间(7)小时) - 这里适合哪些数据类型?
房间(PK id,位置,容量)
你认为更好的设计吗?
第2部分:您要编写以下查询 一个。返回所有学生的名单以及他们每人上几门课程?从最高到最低的顺序。
select s.id as STUDENT_ID,
s.first as FIRST_NAME,
s.last as LAST_NAME,
count (s.CourseId) as COURSE_COUNT
from dbo.Students as s
Group by s.id
order by count(s.CourseId) desc
--STUDENT_ID, FIRST_NAME, LAST_NAME, COURSE_COUNT
湾哪个学生人数最多?
Create view q2 as
select top 1
c.name as COURSE_NAME,
count(s.id) as STUDENT_COUNT
from dbo.Students as s
JOIN dbo.Courses as c
ON (s.CourseId = c.id)
Group by c.name
order by count(s.id) desc
--COURSE_NAME, STUDENT_COUNT
℃。哪个房间有2个或更多课程重叠?
Create view q3 as
select sc.room as CLASSROOM_ID,
r.location as LOC,
COUNT(sc.courseId) as OVERLAP_COURSE_COUNT
from dbo.Schedule as sc
JOIN dbo.Rooms as r
ON (sc.room = r.room)
Group by sc.room, sc.day, sc.hour
HAVING COUNT(sc.courseId) > 1
--CLASSROOM_ID, LOC (Location), OVERLAP_COURSE_COUNT
d。哪些课程未在附表中安排?
Create view q4 as
select c.id as COURSE_ID,
c.name as NAME
from dbo.Courses as c
where c.id not in
(select sc.courseId
from dbo.Schedule as sc)
-- COURSE_ID, NAME
-- not in (course_id from dbo.Schedule)
您同意这些疑问吗?有没有更好的实施方式? 我会尝试执行它们,但感谢任何评论。
答案 0 :(得分:1)
1部分:
You are to design a schema (some tables) in which a student will have
id,name;一门课程会有id,name; 计划将有roomId,开始 时间;一个房间将有id,位置, 容量。
我建立了以下内容:学生 (varchar(10)PK id,first,last, courseId) - 顺便说一句我认为最好 添加enumertion(标识)列 并调用此列+ id列 PK - 所以可能不止一个 每个学生的行(每个学生都有一行) 课程采取)
课程(varchar(10)PK id,name)
日程安排(FK到课程CourseId,FK 到课程RoomId,日期,时间(7) 小时) - 什么数据类型适合 这里吗?
房间(PK id,位置,容量)
你认为更好的设计吗?
你的桌面设计一开始就有缺陷;有一个更好的方法来设置它。
一般情况下,除非必须,否则请勿将varchar
用于主键。 (请注意,在大多数情况下,你真的不需要。大多数情况下,我的意思是几乎所有。(几乎所有,我的意思是全部。)
您声明要添加一个标识列,这是一个好主意,但是您说要添加它以便您可以多次添加学生(对于多个类),这是一个馊主意。在这种情况下,我会使用一个单独的表来链接您的Students表和Courses表 - 这样,您可以避免重复数据,这可能会导致数据异常。
关于#2 - 您创建的解决方案可以让您在一门课程中添加多个学生。但是,学生不能在学校多参加一门课程吗?你应该重新考虑你的表关系;你可能会意识到这需要一个多对多的表。
如果您在Rooms和课程之间创建链接表,并且想知道应该使用哪种数据类型 - 您应该使用外键使用的数据类型,否则您将得到一个尝试创建外键时出错。 (这至少是MySQL的情况,尽管从你的查询语法看起来好像你正在编写一个Microsoft实现。)至于其余部分,我会使用time
数据类型来实现它。时间,以及当天的某种类型的枚举值。