Database 数据库模式问题
我很难决定如何在数据库模式中处理业务需求。我在数据库中有很多表,但对于这个问题,我只需要处理三个表:课程、人员课程和人员Database 数据库模式问题,database,database-design,schema,Database,Database Design,Schema,我很难决定如何在数据库模式中处理业务需求。我在数据库中有很多表,但对于这个问题,我只需要处理三个表:课程、人员课程和人员 课程是一个课程列表 人事 这是一份人员名单 PersonnelCourses是课程列表 该人员已采取了 在课程中有一个叫做“环球”的专栏。如果一门课程是通用的,那就意味着所有人员都必须参加该课程 我需要生成人员必须参加的所有通用课程的列表,但生成此列表的唯一方法是交叉连接/笛卡尔连接: 选择p.LastName、C.Name 课程C,人事P 其中Universal=1 从
- 课程是一个课程列表
- 人事 这是一份人员名单
- PersonnelCourses是课程列表 该人员已采取了
-马特有一份每个人都必须参加的课程清单。为什么不把这份清单拿出来用,而不是对每一行重复同样的清单呢?我不明白你为什么要让你的成绩成倍增加。有一个每个人都必须参加的课程列表。为什么不把这份清单拿出来用,而不是对每一行重复同样的清单呢?我不明白您为什么要将结果集相乘。所有人员都不在人员课程表中,只有参加过课程的人员 我认为你的设计很好。你只需要调整你的查询就可以得到你想要的 在子查询中,提取人员所修的课程。然后在外部查询中选择人员必须参加的所有课程,并与子查询进行左外部联接
Select a.CourseName, b.PersonName from Courses a,
(select P.LastName, C.Name from Courses C, Personnel P, PersonnelCourses pc
c.courseid = pc.courseid and
p.personnelid = pc.personnelid and
c.Universal = 1) b
where
a.courseid += b.courseid order by courseid
如果这是一份报告,最好按人员进行筛选。这样,您将看到所有必需的课程,包括每个人所修的课程。所有人员将不在personnelcourses表中,只有已修过课程的人员 我认为你的设计很好。你只需要调整你的查询就可以得到你想要的 在子查询中,提取人员所修的课程。然后在外部查询中选择人员必须参加的所有课程,并与子查询进行左外部联接
Select a.CourseName, b.PersonName from Courses a,
(select P.LastName, C.Name from Courses C, Personnel P, PersonnelCourses pc
c.courseid = pc.courseid and
p.personnelid = pc.personnelid and
c.Universal = 1) b
where
a.courseid += b.courseid order by courseid
如果这是一份报告,最好按人员进行筛选。这样你就可以看到所有的必修课程,包括每个人所修的课程。你的个人课程不是在一个人和课程之间建立了多对多的关系吗?如果不是那么我不确定,如果是那么
select *
from Personnel_Courses
inner join Person on... /*get the Person details*/
inner join Courses on... /*get the Course details*/
where Course.Universal = 1 and Person.Id = @Id
会告诉你他们都学了什么通用课程
然后
select *
from Courses
where Courses.Universal = 1 and Course.Id not in (
select Course.Id from Personnel_Courses
inner join Person on... /*get the Person details*/
inner join Courses on... /*get the Course details*/
where Course.Universal = 1 and Person.Id = @Id
)
会给你他们没有上过的通用课程
对我来说,在代码中执行第二步可能更容易(获取第一个查询结果,从课程表中进行选择以获取所有通用数据,然后进行比较…)您的人员课程不是在人员和课程之间建立了多对多关系吗?如果不是那么我不确定,如果是那么
select *
from Personnel_Courses
inner join Person on... /*get the Person details*/
inner join Courses on... /*get the Course details*/
where Course.Universal = 1 and Person.Id = @Id
会告诉你他们都学了什么通用课程
然后
select *
from Courses
where Courses.Universal = 1 and Course.Id not in (
select Course.Id from Personnel_Courses
inner join Person on... /*get the Person details*/
inner join Courses on... /*get the Course details*/
where Course.Universal = 1 and Person.Id = @Id
)
会给你他们没有上过的通用课程
对我来说,在代码中执行第二步可能会更容易(获取第一个查询结果,从课程表中进行选择以获取所有通用数据,然后进行比较…)这是一个已经编写过相关书籍的主题
你之所以想这样做,部分原因是你有没有重复你自己
所以,为了回答你关于更好的方法的问题,我会回答“否”。这是一个已经有很多书写过的主题
你之所以想这样做,部分原因是你有没有重复你自己
因此,为了回答您关于更好的方法的问题,我会回答否。类似这样的问题(使用现有结构)如何
像这样的(使用现有的结构)怎么样
Universal
是课程的两值(布尔)属性,对吗?在这种情况下,考虑进一步规范化。重新设计,使UniversalCourse
成为一个表,而不是课程
上的列。该表将有一列引用课程。要查找所有通用课程,只需从该表中选择所有内容。现在您可以大大缩短笛卡尔连接,因为您必须仅将人员
乘以UniversalCourse表,消除了where Universal=1
子句。Universal
是课程
的两值(布尔)属性,对吗?在这种情况下,考虑进一步规范化。重新设计,使UniversalCourse
成为一个表,而不是课程
上的列。该表将有一列引用课程。要查找所有通用课程,只需从该表中选择所有内容。现在,您可以大大缩短笛卡尔连接,因为您必须仅用UniversalCourse表乘以personals
,从而消除了where Universal=1
子句