Ако разгледаме модела тук, ще видим следното:
- Потребител е свързан точно с един уебсайт
- Една компания е свързана с точно един уебсайт
- Един уебсайт е свързан точно с един потребител или компания
Третата връзка предполага съществуване на обект "потребител или компания", чийто PRIMARY KEY
трябва да се съхранява някъде.
За да го съхраните, трябва да създадете таблица, която да съхранява PRIMARY KEY
на website owner
субект. Тази таблица може също да съхранява атрибути, общи за потребител и уебсайт.
Тъй като това е връзка едно към едно, атрибутите на уебсайта могат да се съхраняват и в тази таблица.
Атрибутите, които не се споделят от потребители и компании, трябва да се съхраняват в отделна таблица.
За да наложите правилните връзки, трябва да направите PRIMARY KEY
на website
съставен с owner type
като част от него и принуди правилния тип в дъщерните таблици с CHECK
ограничение:
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
)