2016-10-01 90 views
0

這是一個複雜的問題,我希望得到一個簡單的答案。子類型/子類實體的繼承參數

橋接實體是否可以從一個子類型實體繼承PK,該實體本身從其父實體繼承了PK/FK屬性? Conference EDRD Example我做了一個場景來演示我的意思。

所以在這個例子中,有一個父實體捕獲有關會議的信息。會議有兩種可能的子類型:個人和商業,它們有自己的「特殊」屬性,並且沒有顯示爲不必要。

有兩個橋接實體,用於捕獲出席會議的個人或企業的詳細信息。您將看到標有「A」的橋接實體具有直接連接到CONFERENCE實體的橋接實體。我的理解是CONFERENCE_BUSINESS中的PK/FK屬性ConferenceNumber是可以接受的。

我什麼不確定,以及其他希望有人知道答案,是能否橋接實體標記「B」可以繼承PK之下/ FK屬性ConferenceNumber來自亞型實體的個體,或者它應該也有一個直接與會議的關係,如標有「A」的橋接實體?

一個更好的例子是當你有書和電影作爲子類型,並且你希望捕獲作者和演員的細節。由於一本書或多本書的作者以及多部電影或多部電影的作者可能有多個作者,我想使用子類型鑑別器來捕獲這類數據。我想知道是否有人知道(並且可以引用合法來源顯示)樣本Book and Movie Rental ERD:DVD_ACTOR和BOOK_AUTHOR中的橋接實體是否可以從我創建的子類繼承PK/FK?

Book and Movie rental ERD example

乾杯。

+0

你的問題是部分在這裏找到答案。 http://stackoverflow.com/questions/13749525/relational-database-design-multiple-user-types/13752304#13752304 –

回答

0

一種方法我已經有很多成功的用是:

  • 使用(type_name, identifier)
  • 使用整個數據模型
  • 這種複合鍵複合鍵的亞型表約束亞型通過對type_name屬性施加約束

在現實生活中,公司和個人被稱爲legal persons,便利這個模型的超級類型。然而,一家公司可能對一個人的標識符不同(例如,一家公司向不同的官僚機構註冊,而不是一個負責向個人發放社會安全號碼的機構),因此我們需要使用人工標識符。然後,我們可以將真實生活標識符推送到子類型表中。

問題的考慮,但超出了這個答案範圍:

  • 有些鍵外鍵
  • 所有表多於一個關鍵的目的僅僅定義:它(如果有的話)應該是晉升爲主鍵? (提示:它可能是關鍵僅僅是爲了外鍵的目的而定義的!)
  • 定義複合鍵時必須聲明列名的順序:這個順序重要嗎?

以下SQL DDL需要ANSI-92查詢模式,但可以使用Access GUI工具重新創建。請注意,我用LocationCountryCode作爲通用於各類會議的一個屬性,而SloganOrganizerPaysExpenses具體分別爲公司和個人的亞型:

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'))); 
+0

H謝謝你的回覆。我瞭解你的一些迴應,除了你通過複合鍵的意思嗎?你是指複合鍵嗎?如果我看到圖表,我可能會更好地理解。 – Ableman

+0

根據新關係數據庫詞典:術語,概念和示例作者:C.J. Date,「組合鍵/複合鍵=術語可互換使用,表示由兩個或更多屬性組成的鍵」。 – onedaywhen

+0

您可以執行SQL DDL語句,然後在Access中使用ERD thingy?雖然可能有錯誤,因爲它未經測試! – onedaywhen