当前位置: 首页 > 面试题库 >

数据库设计/规范化结构需要包含AND,OR,可选元素及其关系

乜栋
2023-03-14
问题内容

我想将大学课程的详细信息存储在(MySql)数据库中,但是我不确定如何维护模块和选择之间的关系。

基本上,一门课程可以包含必选部分,一组可选模块,一个选项部分,并且每个部分中都可以包含在模块之间包含“与”或“或”的选择。

举个简单的例子
一个60学分的课程有一些必修模块,占40个学分。剩下的20个学分可以从可选模块组中选择。(模块本身可以持有不同数量的积分)。有效地;
('Mandatory module 1' AND 'Mandatory module 2'... AND'Mandatory module N') AND (40 credits from 'optional modules')

ANDs&ORs
当我在上面说模块时,它可以是单个模块,也可以是“模块x或模块Y”,即在强制性部分中。(这些模块显然必须具有相同的信用权重)。或者在可选部分中可能只有一个模块,甚至其中一个选择可能是"module x AND module y"

选项
学生可能需要修读必修模块,再加上 n个
选项之一,其中可能包含或不包含AND,OR,以及强制性和可选部分;即,“选项”具有整个课程模块选择的所有属性。选项部分将与其他部分(例如,必选或可选)进行“与”或“或”运算;即强制性模块“加上以下选项之一”。实际上,options部分是'Option 1' OR 'Option 2'... OR 'Option N'

问题是当操作数可能是另一个AND /
OR操作或单个模块时,如何存储所有AND和OR关系,并跟踪每个选择所允许的信用额度;例如“以下20个学分:”(可选模块组)。


问题答案:

设计相当简单,您只需要带有约束的递归“组”表即可。

Course
- ID
- Title
- Credits

Course_Group
- CourseID
- GroupID

Group
- ID
- GroupID
- Description
- AtLeastNSelections
- AtLeastNCredits

Group_Module
- GroupID
- ModuleID

Module
- ID
- Title
- Credits

一个示例结构是

Course: 1, "Math Major", 60
Group: 1, NULL, "Core Modules", 2, 40
Course_Group: 1, 1
    Group: 2, 1, "Required (5) Core Modules", 5, 25
    Course_Group: 1, 1
    Group_Module: (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)
        Module: 1, "Calculus I", 5
        Module: 2, "Calculus II", 5
        Module: 3, "Calculus III", 5
        Module: 4, "Stats I", 5
        Module: 5, "Stats II", 5
    Group: 3, 1, "Required (3) Of (N) Modules", 3, 15
    Course_Group: 1, 3
    Group_Module: (3, 6), (3, 7), (3, 8), (3, 9), (3, 10)
        Module: 6, "Number Theory", 5
        Module: 7, "Bridge Adv. Math", 5
        Module: 8, "Calculus IV", 5
        Module: 9, "Stats III", 5
        Module: 10, "Finite Math", 5
Group: 4, NULL, "Secondary Modules", 1, 20
Course_Group: 1, 4
    Group: 5, 4, "Comp. Sci.", 2, 0
    Course_Group: 1, 5
    Group_Module: (5, 11), (5, 12), (5, 13), (5, 14), (5, 15), (5, 16)
        Module: 11, "Math in Hardware", 4
        Module: 12, "Math in Software", 4
        Module: 13, "Programming 101", 4
        Module: 14, "Algorithms 101", 4
        Module: 15, "Programming I", 5
        Module: 16, "Programming II", 5
    Group: 6, 4, "Physics", 0, 8
    Course_Group: 1, 6
    Group_Module: (6, 17), (6, 18), (6, 19), (6, 20)
        Module: 17, "Physics Mechanics", 4
        Module: 18, "Physics Thermodynamics", 4
        Module: 19, "Physics Magnetism", 5
        Module: 20, "Physics Theoretical", 5
    Group: 7, 4, "Gen. Ed.", 0, 0
    Course_Group: 1, 7
    Group_Module: (7, 21), (7, 22), (7, 23), (7, 24)
        Module: 21, "Business Writing", 3
        Module: 22, "Ethics", 3
        Module: 23, "Aesthetics", 3
        Module: 24, "Graphic Design", 3

快速浏览…“数学专业”课程在其下分为“核心模块”和“中学模块”两个小组。“核心模块”至少需要2个孩子,并且至少需要40个学分。“中学课程”至少需要1个孩子,并且至少需要20个学分。

您可以看到,“核心模块”下组的约束比“第二模块”下组的约束更具限制性。

要输出上面的示例结构,将类似于以下内容。

SELECT c.Title, g.Description, m.Title FROM Course c
 INNER JOIN Course_Group cg ON c.ID = cg.CourseID
 INNER JOIN Group g ON cg.GroupID = g.ID
 INNER JOIN Group_Module gm ON g.ID = gm.GroupID
 INNER JOIN Module m ON gm.ModuleID = m.ID
WHERE c.ID = 1
ORDER BY g.GroupID, g.ID, m.Title

因此,如果您有课程和模块,则可以从Course_Group表中获取课程的所有组,并从Group_Module表中获取模块所属的组。将模块放入他们的组后,您可以沿着Group.GroupID父级链检查组的约束AtLeastNSelections和AtLeastNCredits,直到获得Group.GroupID
= NULL。



 类似资料:
  • 设计工具 所有的数据库设计必须采用PowerDesigner 16.5进行设计 设计规范 所有的表、字段,code必须采用英文命名,不允许采用中文拼音或者缩写。表的name必须为中文命名。 所有的表必须包含id(VARCHAR2 128 BYTE)、create_time(DATETIME,自动更新)、last_update_time(DATETIME,自动更新)三个字段

  • 我想知道SAML解决方案(身份提供者或服务提供商)是否需要支持SAML元数据交换(即SAML元数据规范),以便被定义为完全符合SAML 2.0。 查看SAML一致性文档,不太清楚根据RFC 2119,这是必须的、应该的还是可能的。 任何想法我应该在哪里寻找? 裁判: http://docs.oasis-open.org/security/saml/v2.0/saml-conformance-2.0

  • 上一小节介绍了如何设计数据表,并合理选择字段数据类型新建数据表,本小节来介绍数据表的设计规范,主要遵循数据表设计三范式和适当的反范式化。 1.第一设计范式 第一设计范式要求表中字段都是不可再分的,如果实体中的某个属性有多个值时,必须拆分为不同的属性 。通俗理解即一个字段只存储一项信息,如下图所示,其中联系方式可以拆分为手机、邮箱、固定电话,所以下图不符合数据表第一设计范式要求: 纠正之后符合第一设

  • 问题内容: 我想知道是否有人对如何规范化数据库有任何建议。现在,我不是要设计结构,而是要实际将数据库数据从旧结构移动到新的规范化结构。我知道我可以编写类似PHP脚本的内容,但是我想知道是否有一种方法可以在SQL中进行。特别是MySQL。 **编辑:有人尝试过SwisSQL吗?这是一个迁移工具,但我不确定它是否能满足我的要求。 问题答案: 这是在脚本中标准化表的示例。我建议你做这样的事情 您将首先创

  • 表规范 命名统一小写下划线 非CMF核心应用,统一带应用表前缀,如portal_ 插件表,统一带插件表前缀,如:demo_ 表默认编码utf8mb4,默认排序规则utf8mb4_general_ci 引擎统一innodb 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以预见的未来

  • 表规范 命名统一小写下划线 非CMF核心应用,统一带应用表前缀,如portal_ 插件表,统一带插件表前缀,如:plugindemo 表默认编码utf8mb4,默认排序规则utf8mb4_general_ci 引擎统一innodb 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以