Mysql
 sql >> Base de données >  >> RDS >> Mysql

Clés étrangères multiples mais mutuellement exclusives - est-ce la voie à suivre ?

Si nous examinons le modèle ici, nous verrons ce qui suit :

  1. Un utilisateur est associé à exactement un site Web
    • Une entreprise est liée à un seul site Web
    • Un site Web est associé à exactement un utilisateur ou une entreprise

La troisième relation implique l'existence d'une entité "utilisateur ou entreprise" dont la PRIMARY KEY doit être stocké quelque part.

Pour le stocker, vous devez créer une table qui stockerait une PRIMARY KEY d'un website owner entité. Cette table peut également stocker des attributs communs à un utilisateur et à un site Web.

Puisqu'il s'agit d'une relation un à un, les attributs du site Web peuvent également être stockés dans ce tableau.

Les attributs non partagés par les utilisateurs et les entreprises doivent être stockés dans la table séparée.

Pour forcer les bonnes relations, vous devez créer la PRIMARY KEY du website composite avec owner type comme une partie de celui-ci, et forcez le type correct dans les tables enfants avec un CHECK contrainte :

CREATE TABLE website_owner (
    type INT NOT NULL,
    id INT NOT NULL,
    website_attributes,
    common_attributes,
    CHECK (type IN (1, 2)) -- 1 for user, 2 for company
    PRIMARY KEY (type, id)
)

CREATE TABLE user (
    type INT NOT NULL,
    id INT NOT NULL PRIMARY KEY,
    user_attributes,
    CHECK (type = 1),
    FOREIGN KEY (type, id) REFERENCES website_owner
)

CREATE TABLE company (
    type INT NOT NULL,
    id INT NOT NULL PRIMARY KEY,
    company_attributes,
    CHECK (type = 2),
    FOREIGN KEY (type, id) REFERENCES website_owner
)