【问题标题】:SQL Server triple many to many relationshipSQL Server 三倍多对多关系
【发布时间】:2019-04-11 09:34:26
【问题描述】:

我正在尝试为员工培训网站绘制数据库。

它的工作原理如下:

  1. 将为每位员工分配一个或多个模块。

  2. 每个模块都将被分配一个或多个课程。

同一模块可以分配给多个员工,同一课程可以分配给多个模块。

每门课程都有一个已完成的状态,并且每个模块也将具有一个已完成状态,这取决于该员工的该模块的所有课程何时完成。

那么这会是第三级关系吗?还是三重多对多关系? 数据库将如何设置?

这是我目前的想法。

员工

 EmployeeID 
 Name

模块

 ModuleID
 ModuleName
 Status

课程

 CourseID
 CourseName
 Status

员工模块

 EmployeeID
 ModuleID

模块课程

 ModuleID
 CourseID

我不认为这是正确的,因为课程不会对每个员工都是独一无二的,但它会是每个模块,这不是目标。

如何改进此设计?

【问题讨论】:

  • 员工是直接分配课程还是分配模块?换句话说,是否可以为员工分配课程的部分,或者他们是否总是必须完成所修课程中的所有模块?
  • 为了避免混淆,Module 是父级, course 是子级。 (这是客户如何构建它的)。因此,员工将被分配一个包含课程的模块。他们将被分配完整的模块,而不是其中的一部分

标签: sql-server database database-design many-to-many


【解决方案1】:

考虑以下 ERD:

首先对图表进行一些解释...

在此 ERD 中,蓝色实体类型类似于主表。绿色实体类型类似于事务表。对于属性,下划线的是候选键。您可能喜欢每个表的代理键 - 如果是的话 - 请继续,或者您可以使用图中显示的(有时是复合)键。只要图表中的键是唯一的,您就可以开始了。

现在,我在说什么,它对您有什么帮助?...

您担心的是,您希望针对分配给他们的每门课程跟踪每位员工的进度,如果我理解正确,您还希望针对每位员工的整个模块跟踪状态。

为此,您需要将课程和模块的定义(蓝色实体类型)与跟踪学习者(绿色实体类型)分开。因此,您在问题中提出的表格不足以满足您的需求。特别是,您不能拥有Course.status 字段,因为显然状态会因参加课程的人而异。

您的情况并不需要三倍多对多。相反,我的建议是,对于分配到模块的每个员工,您为该特定员工和模块创建一组注册记录。请注意,这使它成为模块(注册)和课程(注册)之间的一对多,而不是多对多,因为一旦员工注册到模块中,该模块的子课程就是已知的。如果您关注我,就这位员工而言,其他模块中发生了什么以及如何在模块之间共享课程并不重要。

现在您可以针对Employee_Course_Status 表中的每门课程跟踪员工的进度。您必须在代码中管理的唯一潜在问题是 Module_Enrolment.EmployeeModuleStatus 值。根据您的业务规则,这可能会根据课程级别的许多状态值进行计算。这会造成一些冗余和更新异常的机会(您的课程状态值和模块状态值会出现问题)。

这是您必须管理的风险。您的架构可以使用数据库规范化和声明性引用约束来防止多种类型的数据不一致,但有时您只需要求助于基于代码的控件。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多