Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie bindet man Benutzer an verschiedene Organisationen, Universitäten, Unternehmen mit unterschiedlichen Rollen?

-- User USR exists.
--
user {USR}
  PK {USR}
-- Role ROL exists.
--
role_ {ROL}
   PK {ROL}

Xorg ist ein Oberbegriff für eine Universität, eine Organisation oder eine Stiftung. Unterscheidungsmerkmal TYP wird verwendet, um zwischen diesen dreien zu unterscheiden.

-- Xorg XOG, of type TYP, named XNM was created
-- (is owned) by user USR.
--
xorg {XOG, TYP, USR, XNM, ...common_cols}
  PK {XOG}
  SK {XOG, TYP}

CHECK TYP in {'U', 'O', 'F'}

FK {USR} REFERENCES user {USR}
-- University (xorg) XOG, of xorg-type TYP = 'U', exists.
--
university {XOG, TYP, ...university_specific_cols}
        PK {XOG}

CHECK TYP = 'U'

FK {XOG, TYP} REFERENCES xorg {XOG, TYP}
-- Organization (xorg) XOG, of xorg-type TYP = 'O', exists.
--
organization {XOG, TYP, ...organization_specific_cols}
          PK {XOG}

CHECK TYP = 'O'

FK {XOG, TYP} REFERENCES xorg {XOG, TYP}
-- Foundation (xorg) XOG, of xorg-type TYP = 'F', exists.
--
organization {XOG, TYP, ...foundation_specific_cols}
          PK {XOG}

CHECK TYP = 'F'

FK {XOG, TYP} REFERENCES xorg {XOG, TYP}
-- User USR is member of xorg XOG, of xorg-type TYP,
-- in role ROL.
--
user_xorg {USR, XOG, TYP, ROL}
       PK {USR, XOG}

      FK1 {XOG, TYP} REFERENCES
     xorg {XOG, TYP}

      FK2 {USR} REFERENCES user  {USR}
      FK3 {ROL} REFERENCES role_ {ROL}

Hinweis:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key   (Unique)
SK = Proper Superkey (Unique)
FK = Foreign Key

Ein Wort zu Subtypen . Der richtige Weg, Einschränkungen für Untertypen zu implementieren, wäre die Verwendung von Zusicherungen (CREATE ASSERTION ), aber es ist immer noch nicht in den wichtigsten DBs verfügbar. Ich verwende FKs stattdessen, und wie alle anderen Ersatzmethoden ist es nicht perfekt. Die Leute streiten viel über SO und SE-DBA, was besser ist. Ich ermutige Sie, auch andere Methoden zu prüfen.