ここでモデルを調べると、次のことがわかります。
- ユーザーは1つのウェブサイトにのみ関連しています
- 会社は1つのウェブサイトにのみ関連しています
- ウェブサイトは1人のユーザーまたは会社にのみ関連しています
3番目の関係は、PRIMARY KEY
を持つ「ユーザーまたは会社」エンティティの存在を意味します。 どこかに保存する必要があります。
それを保存するには、PRIMARY KEY
を保存するテーブルを作成する必要があります website owner
の 実在物。このテーブルには、ユーザーとWebサイトに共通の属性を格納することもできます。
これは1対1の関係であるため、Webサイトの属性もこのテーブルに格納できます。
ユーザーや企業が共有していない属性は、別のテーブルに保存する必要があります。
正しい関係を強制するには、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
)