一種方法我已經有很多成功的用是:
- 使用
(type_name, identifier)
- 使用整個數據模型
- 這種複合鍵複合鍵的亞型表約束亞型通過對
type_name
屬性施加約束
在現實生活中,公司和個人被稱爲legal persons,便利這個模型的超級類型。然而,一家公司可能對一個人的標識符不同(例如,一家公司向不同的官僚機構註冊,而不是一個負責向個人發放社會安全號碼的機構),因此我們需要使用人工標識符。然後,我們可以將真實生活標識符推送到子類型表中。
問題的考慮,但超出了這個答案範圍:
- 有些鍵外鍵
- 所有表多於一個關鍵的目的僅僅定義:它(如果有的話)應該是晉升爲主鍵? (提示:它可能是關鍵僅僅是爲了外鍵的目的而定義的!)
- 定義複合鍵時必須聲明列名的順序:這個順序重要嗎?
以下SQL DDL需要ANSI-92查詢模式,但可以使用Access GUI工具重新創建。請注意,我用LocationCountryCode
作爲通用於各類會議的一個屬性,而Slogan
和OrganizerPaysExpenses
具體分別爲公司和個人的亞型:
CREATE TABLE LegalPersons
(PersonNumber INT NOT NULL UNIQUE,
PersonType CHAR(10) NOT NULL,
CHECK (PersonType IN ('Individual', 'Company')),
UNIQUE (PersonType, PersonNumber));
CREATE TABLE Individuals
(PersonNumber INT NOT NULL UNIQUE,
PersonType CHAR(10) NOT NULL,
CHECK (PersonType = 'Individual'),
UNIQUE (PersonType, PersonNumber),
FOREIGN KEY (PersonType, PersonNumber)
REFERENCES LegalPersons (PersonType, PersonNumber),
LastName VARCHAR(35) NOT NULL,
FirstName VARCHAR(35) NOT NULL);
CREATE TABLE Companies
(PersonNumber INT NOT NULL UNIQUE,
PersonType CHAR(10) NOT NULL,
CHECK (PersonType = 'Company'),
UNIQUE (PersonType, PersonNumber),
FOREIGN KEY (PersonType, PersonNumber)
REFERENCES LegalPersons (PersonType, PersonNumber),
CompanyRegisteredNumber CHAR(8) NOT NULL UNIQUE);
CREATE TABLE Conferences
(ConferenceNumber CHAR(10) NOT NULL UNIQUE,
PersonNumber INT NOT NULL,
PersonType CHAR(10) NOT NULL,
FOREIGN KEY (PersonType, PersonNumber)
REFERENCES LegalPersons (PersonType, PersonNumber),
UNIQUE (PersonType, ConferenceNumber),
LocationCountryCode CHAR(3) NOT NULL);
CREATE TABLE BusinessConferences
(ConferenceNumber CHAR(10) NOT NULL UNIQUE,
PersonType CHAR(10) NOT NULL,
CHECK (PersonType = 'Company'),
FOREIGN KEY (PersonType, ConferenceNumber)
REFERENCES Conferences (PersonType, ConferenceNumber),
Slogan VARCHAR(100) NOT NULL);
CREATE TABLE IndividualConferences
(ConferenceNumber CHAR(10) NOT NULL UNIQUE,
PersonType CHAR(10) NOT NULL,
CHECK (PersonType = 'Individual'),
FOREIGN KEY (PersonType, ConferenceNumber)
REFERENCES Conferences (PersonType, ConferenceNumber),
OrganizerPaysExpenses CHAR(1) DEFAULT 'Y' NOT NULL,
CHECK (OrganizerPaysExpenses IN ('Y', 'N')));
你的問題是部分在這裏找到答案。 http://stackoverflow.com/questions/13749525/relational-database-design-multiple-user-types/13752304#13752304 –