Om vi tittar på modellen här kommer vi att se följande:
- En användare är relaterad till exakt en webbplats
- Ett företag är relaterat till exakt en webbplats
- En webbplats är relaterad till exakt en användare eller ett företag
Den tredje relationen innebär att det finns en "användare eller företag"-enhet vars PRIMARY KEY
bör förvaras någonstans.
För att lagra den måste du skapa en tabell som skulle lagra en PRIMARY KEY
av en website owner
entitet. Den här tabellen kan också lagra attribut som är gemensamma för en användare och en webbplats.
Eftersom det är en en-till-en-relation kan webbplatsattribut också lagras i den här tabellen.
De attribut som inte delas av användare och företag bör lagras i den separata tabellen.
För att tvinga fram de korrekta relationerna måste du skapa PRIMARY KEY
för website
sammansatt med owner type
som en del av det, och tvinga fram rätt typ i de underordnade tabellerna med en CHECK
begränsning:
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
)