Si observamos el modelo aquí, veremos lo siguiente:
- 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
)