sql >> Base de Datos >  >> RDS >> Mysql

Claves foráneas múltiples pero mutuamente excluyentes:¿es este el camino a seguir?

Si observamos el modelo aquí, veremos lo siguiente:

  1. Un usuario está relacionado con exactamente un sitio web
    • Una empresa está relacionada exactamente con un sitio web
    • Un sitio web está relacionado exactamente con un usuario o empresa

La tercera relación implica la existencia de una entidad "usuario o empresa" cuya PRIMARY KEY debe almacenarse en algún lugar.

Para almacenarlo, debe crear una tabla que almacene una PRIMARY KEY de un website owner entidad. Esta tabla también puede almacenar atributos comunes para un usuario y un sitio web.

Dado que es una relación uno a uno, los atributos del sitio web también se pueden almacenar en esta tabla.

Los atributos no compartidos por los usuarios y las empresas deben almacenarse en una tabla separada.

Para forzar las relaciones correctas, debe crear la PRIMARY KEY del website compuesto con owner type como parte de él, y fuerce el tipo correcto en las tablas secundarias con CHECK restricción:

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
)