【问题标题】:1-M Relationship database design1-M关系数据库设计
【发布时间】:2014-09-13 12:40:47
【问题描述】:

我正在尝试为以下场景设计数据库。

学生可以注册课程,在给定的时间学生可以拥有 只有一个注册程序。但是,他/她必须能够更改 在任何给定时间注册的程序(包括注册新程序)。最终,学生可以 注册到多个程序,但他必须只有 1 个活动 程序。

我认为应该是1-M关系,但是如何处理这种“在给定时间有1个活动程序”的情况?

【问题讨论】:

    标签: mysql sql sql-server database database-design


    【解决方案1】:

    您的学生表将具有与Program 表相关的ProgramID,例如,他/她选择并将成为当前程序。现在,每次他/她更改他/她的程序时,ProgramID 都会更改,但是会有一个ProgramHistory 来记录更改。

    所以可能的表是StudentProgramProgramHistory

    示例

    学生

    StudentID    Lastname    Firstname   Gender  ProgramID
    ------------------------------------------------------
    101          Smith       Jason       M       1
    102          Jones       Kate        F       2
    

    计划

    ProgramID    ProgramName
    ------------------------------
    1            Computer Science
    2            Nursing
    3            Electrical Engineering
    

    节目历史

    ID         ProgramID    StudentID    Semester    Year
    -----------------------------------------------------
    1          3            101          Spring      2014
    2          2            102          Fall        2014
    3          1            101          Fall        2014
    

    【讨论】:

      【解决方案2】:

      要允许跟踪计划注册的历史记录,您需要有一个ProgramHistory 表,它是StudentProgram 之间的多对多关系的交集

      有几种方法可以确保给定学生一次只有一个活动计划。

      一种方法是将active_program_key 列放在学生表中,并将其作为Program 表的外键。这可能不是最好的选择,因为它需要对数据进行非规范化,并且由此产生的重复可能会导致数据不一致,除非您采取重要措施来避免它们。

      使用声明性约束的另一个选项是在ProgramHistory 表上创建一个唯一索引,其中包括student_keyenrollment_date。这样可以确保学生在每个给定日期只能注册一次。活动计划将是任何给定学生的最新日期记录。

      第二个选项很简单,可以避免重复任何数据。公平地说,检索当前学生注册的查询会稍微复杂一些。与往常一样,设计是关于权衡的。

      假设学生几乎可以在任何时间(即不仅仅是学期之间)更改课程,那么您希望在ProgramHistory 表中有一个program_start_date

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多