sql >> データベース >  >> RDS >> Mysql

データベース設計/正規化構造には、AND、OR、オプションの要素、およびそれらの関係が含まれている必要があります

    非常に単純な最初のアプローチは、4つのテーブルのみを使用することです。

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

    そしてこれらの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)
    ) ;
    

    ここで、説明が示すように、Course_Moduleの代わりに、許可されているモジュールとコースの組み合わせがより複雑な場合 およびCourse_MandatoryModule 複雑な階層モデルを定義できるテーブル:

    コース:

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

    モジュールと(モジュール)のグループ:

    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)
    ) ;
    

    および関係(モジュールはグループに属します):

    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)
    ) ;
    

    そして(最後に)コースはモジュールのグループを持つことができます:

    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)
    ) ;
    


    1. ALTERTABLEステートメントに「ONDELETECASCADE」を追加する方法

    2. NULLの場合、MAX関数で0を設定するにはどうすればよいですか?

    3. 列名の競合をどのように回避しますか?

    4. ADDTIME()は24時間制を返します