Jeśli przyjrzymy się temu modelowi, zobaczymy:
- Użytkownik jest powiązany z dokładnie jedną witryną
- Firma jest powiązana z dokładnie jedną witryną
- Witryna jest powiązana z dokładnie jednym użytkownikiem lub firmą
Trzecia relacja sugeruje istnienie encji „użytkownika lub firmy”, której PRIMARY KEY powinny być gdzieś przechowywane.
Aby go przechowywać, musisz utworzyć tabelę, która będzie przechowywać PRIMARY KEY website owner podmiot. Ta tabela może również przechowywać atrybuty wspólne dla użytkownika i witryny.
Ponieważ jest to relacja jeden do jednego, atrybuty witryny mogą być również przechowywane w tej tabeli.
Atrybuty, które nie są współdzielone przez użytkowników i firmy, powinny być przechowywane w osobnej tabeli.
Aby wymusić prawidłowe relacje, musisz utworzyć PRIMARY KEY website złożony z owner type jako jego część i wymuś poprawny typ w tabelach podrzędnych za pomocą CHECK ograniczenie:
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
)