Database 数据库模式问题

Database 数据库模式问题,database,database-design,schema,Database,Database Design,Schema,我很难决定如何在数据库模式中处理业务需求。我在数据库中有很多表,但对于这个问题,我只需要处理三个表:课程、人员课程和人员 课程是一个课程列表 人事 这是一份人员名单 PersonnelCourses是课程列表 该人员已采取了 在课程中有一个叫做“环球”的专栏。如果一门课程是通用的,那就意味着所有人员都必须参加该课程 我需要生成人员必须参加的所有通用课程的列表,但生成此列表的唯一方法是交叉连接/笛卡尔连接: 选择p.LastName、C.Name 课程C,人事P 其中Universal=1 从

我很难决定如何在数据库模式中处理业务需求。我在数据库中有很多表,但对于这个问题,我只需要处理三个表:课程、人员课程和人员

  • 课程是一个课程列表
  • 人事 这是一份人员名单
  • PersonnelCourses是课程列表 该人员已采取了
在课程中有一个叫做“环球”的专栏。如果一门课程是通用的,那就意味着所有人员都必须参加该课程

我需要生成人员必须参加的所有通用课程的列表,但生成此列表的唯一方法是交叉连接/笛卡尔连接:

选择p.LastName、C.Name 课程C,人事P 其中Universal=1

从那以后,我想在人事课程上做一个左键连接,这样我就可以有一个所有人员的列表,以及他们必须参加的课程,以及他们已经参加的课程。我想如果在人事和课程之间有一个多对多的表格,这一切都会变得容易。但是,如果所有人员都要坐在中间的桌子上,这不是有点多余吗

有没有更好的方法来处理这个问题

非常感谢,
-马特

有一份每个人都必须参加的课程清单。为什么不把这份清单拿出来用,而不是对每一行重复同样的清单呢?我不明白你为什么要让你的成绩成倍增加。

有一个每个人都必须参加的课程列表。为什么不把这份清单拿出来用,而不是对每一行重复同样的清单呢?我不明白您为什么要将结果集相乘。

所有人员都不在人员课程表中,只有参加过课程的人员

我认为你的设计很好。你只需要调整你的查询就可以得到你想要的

在子查询中,提取人员所修的课程。然后在外部查询中选择人员必须参加的所有课程,并与子查询进行左外部联接

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
子句