sql >> Databasteknik >  >> RDS >> Mysql

Abstrakt klass från UML till ER-diagram. Möjligt? Hur?

Det finns i princip tre val för att översätta generalisering till en databasmodell

1. Ett bord per betongklass

Skapa tabeller Admin , Teacher och Student . Var och en av dessa tabeller innehåller kolumner för alla attribut och relationer för User

  • Pro
    • Alla fält i en konkret underklass finns i samma tabell, så ingen koppling behövs för att få all studentdata
    • Enkla begränsningar för datavalidering (som obligatoriska fält för Student )
  • Con
    • Alla fält för User dupliceras i varje underklasstabell
    • Främmande nycklar till User måste delas upp i tre FK-fält. En för Admin , en för Teacher och en för Student .

2. På bordet för hela generaliseringsuppsättningen

I det här fallet har du bara ett tabellanrop User som innehåller alla fält för User + alla fält i alla underklasser av User

  • Pro
    • Alla fält finns i samma tabell, så ingen anslutning behövs för att få alla User data
    • Ingen uppdelning av FK:er till User
  • Con
    • Det finns ett gäng fält som aldrig används. Alla fält specifika för Student och Teacher fylls aldrig i för Admins och vice versa
    • Datavalidering som obligatoriska fält för en konkret klass som Student bli ganska komplex eftersom det inte längre är en enkel Not Null begränsning.

3. Ett bord per betongklass och ett för superklassen

I det här fallet skapar du tabeller för var och en av de konkreta underklasserna och du skapar en tabell för klassen User . Var och en av de konkreta underklasstabellerna har en obligatorisk FK till User

  • Pro
    • Mest normaliserade schema:Inga upprepade fält för användarens attribut och inga oanvända fält.
    • Ingen uppdelning av FK:er till User
    • Enkla begränsningar för datavalidering (som obligatoriska fält för Student )
  • Con
    • Du måste fråga två tabeller om du vill ha all data för en Student
    • Komplexa valideringsregler för att säkerställa att varje User posten har exakt en Admin , Teacher eller Student spela in.

Vilket av dessa alternativ du väljer beror på ett antal saker som antalet underklasser, antalet attribut i antingen underklass eller superklass, antalet FK till superklassen, och förmodligen några andra saker som jag inte gjorde tänka på.




  1. Använd kolumnalias i samma val

  2. cron jobb för att ta bort gammal data från postgres på debian

  3. MySQL sök och ersätt syntaxfel

  4. MySQL får rader men föredrar ett kolumnvärde framför ett annat