Se esaminiamo il modello qui, vedremo quanto segue:
- Un utente è correlato esattamente a un sito Web
- Un'azienda è collegata esattamente a un sito web
- Un sito web è correlato esattamente a un utente o azienda
La terza relazione implica l'esistenza di un'entità "utente o azienda" la cui PRIMARY KEY
dovrebbe essere conservato da qualche parte.
Per memorizzarlo è necessario creare una tabella che memorizzi una PRIMARY KEY
di un website owner
entità. Questa tabella può anche memorizzare attributi comuni per un utente e un sito web.
Poiché si tratta di una relazione uno-a-uno, anche gli attributi del sito Web possono essere archiviati in questa tabella.
Gli attributi non condivisi da utenti e aziende devono essere archiviati in una tabella separata.
Per forzare le relazioni corrette, è necessario creare la PRIMARY KEY
del website
composto con owner type
come parte di esso e forzare il tipo corretto nelle tabelle figlio con un CHECK
vincolo:
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
)