Si nous examinons le modèle ici, nous verrons ce qui suit :
- Un utilisateur est associé à exactement un site Web
- Une entreprise est liée à un seul site Web
- Un site Web est associé à exactement un utilisateur ou une entreprise
La troisième relation implique l'existence d'une entité "utilisateur ou entreprise" dont la PRIMARY KEY
doit être stocké quelque part.
Pour le stocker, vous devez créer une table qui stockerait une PRIMARY KEY
d'un website owner
entité. Cette table peut également stocker des attributs communs à un utilisateur et à un site Web.
Puisqu'il s'agit d'une relation un à un, les attributs du site Web peuvent également être stockés dans ce tableau.
Les attributs non partagés par les utilisateurs et les entreprises doivent être stockés dans la table séparée.
Pour forcer les bonnes relations, vous devez créer la PRIMARY KEY
du website
composite avec owner type
comme une partie de celui-ci, et forcez le type correct dans les tables enfants avec un CHECK
contrainte :
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
)