Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Chaves estrangeiras múltiplas, mas mutuamente exclusivas - esse é o caminho a seguir?


Se olharmos para o modelo aqui, veremos o seguinte:
  1. 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
)