Se olharmos para o modelo aqui, veremos o seguinte:
- Um usuário está relacionado a exatamente um site
- Uma empresa está relacionada a exatamente um site
- Um site está relacionado a exatamente um usuário ou empresa
A terceira relação implica a existência de uma entidade "usuário ou empresa" cuja
PRIMARY KEY
deve ser armazenado em algum lugar. Para armazená-lo, você precisa criar uma tabela que armazenaria uma
PRIMARY KEY
de um website owner
entidade. Essa tabela também pode armazenar atributos comuns para um usuário e um site. Como é uma relação um-para-um, os atributos do site também podem ser armazenados nesta tabela.
Os atributos não compartilhados por usuários e empresas devem ser armazenados em tabela separada.
Para forçar os relacionamentos corretos, você precisa fazer a
PRIMARY KEY
do website
composto com owner type
como parte dele e force o tipo correto nas tabelas filhas com um CHECK
limitação: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
)