Database design / normalization structure needs to contain ANDs, ORs, optional elements and their relationships

后端 未结 5 836
轮回少年
轮回少年 2021-02-06 07:31

I want to store the details of college courses in a (MySql) database but I\'m not sure how to maintain the relationship between modules and selections.

Basically, a cour

5条回答
  •  遇见更好的自我
    2021-02-06 08:27

    A very simple, first approach would be using just 4 tables:

    TABLE Course 
    ( CourseId 
    , Title 
    , TotalCredits 
    , ... other stuff
    , PRIMARY KEY (CourseId)
    ) ;
    
    TABLE Module 
    ( ModuleId 
    , Description 
    , Hours
    , Credits
    , ... other stuff
    , PRIMARY KEY (ModuleId)
    ) ;
    

    and the combinations allowed through these 2:

    TABLE Course_Module 
    ( CourseID                 --- for this course
    , ModuleID                 --- this module is allowed (optional or mandatory)
    , PRIMARY KEY (CourseID, ModuleId)
    , FOREIGN KEY (CourseId) 
        REFERENCES Course (CourseId)
    , FOREIGN KEY (ModuleId)
        REFERENCES Module (ModuleId)
    ) ;
    
    TABLE Course_MandatoryModule 
    ( CourseID                  --- for this course
    , ModuleID                  --- this module is mandatory
    , PRIMARY KEY (CourseID, ModuleId)
    , FOREIGN KEY (CourseID, ModuleId)
        REFERENCES Course_Module (CourseID, ModuleId)
    ) ;
    

    Now, if your allowed combinations of modules and courses is more complicated, as your description suggests, instead of the Course_Module and the Course_MandatoryModule tables you could define a complex hierarchical model:

    Courses:

    TABLE Course                        --- same as previous model
    ( CourseId 
    , Title 
    , TotalCredits 
    , ... other stuff
    , PRIMARY KEY (CourseId)
    ) ;
    

    Modules and groups of (modules):

    TABLE ModuleEntity                  --- the supertype for both
    ( ModuleEntityId                    --- modules and group of modules
    , PRIMARY KEY (ModuleEntityId)
    ) ;
    
    TABLE Module                        --- subtype
    ( ModuleId 
    , Description 
    , Hours
    , Credits
    , ... other stuff
    , PRIMARY KEY (ModuleId)
    , FOREIGN KEY (ModuleId) 
        REFERENCES ModuleEntity (ModuleEntityId)
    ) ;
    
    TABLE ModuleGroup                  --- group of modules
    ( ModuleGroupId                    --- subtype of the supertype (entity)
    , GroupDescription        
    , PRIMARY KEY (ModuleGroupId)
    , FOREIGN KEY (ModuleGroupId) 
        REFERENCES ModuleEntity (ModuleEntityId)
    ) ;
    

    and relationship (module belongs to group):

    TABLE Module_in_Group  
    ( ModuleEntityId               --- this module or group
    , ModuleGroupId                --- is in this group
    , PRIMARY KEY (ModuleEntityId, ModuleGroupID)
    , FOREIGN KEY (ModuleEntityId)
        REFERENCES ModuleEntity (ModuleEntityId)
    , FOREIGN KEY (ModuleGroupId)
        REFERENCES ModuleGroup (ModuleGroupId)
    ) ;
    

    and (finally) course can have group of modules:

    TABLE Course_ModuleGroup
    ( CourseId                 --- for this course
    , ModuleGroupId            --- this module group is allowed
    , PRIMARY KEY (CourseID, ModuleGroupId)
    , FOREIGN KEY (CourseId) 
        REFERENCES Course (CourseId)
    , FOREIGN KEY (ModuleGroupId)
        REFERENCES ModuleGroup (ModuleGroupId)
    ) ;
    

提交回复
热议问题