我沒有大量數據庫/ postgres的經驗,而且我一直在努力尋找最佳方式來組織以下幾天組織具有繼承結構但沒有新屬性的表格
- 我有三個不同的表具有相同的屬性(只有一個)。
- 讓我們稱他們爲A1,A2和A3,因爲這就是我畫了他們在我的ERD
- 這三張表分享4代外表相同的三個關係
- 這三張表具有獨特的之間的關係,具體到你正在考慮的表
我的ERD嘗試的鏈接在下面的評論。
嘗試1
我已決定於這樣的結構,但我意識到,木匠的表1,2,3和4就必須有一列結構,如:
CREATE TABLE joiner (
1_id integer REFERENCES 1 (id),
A1_id integer REFERENCES A1 (id),
A2_id integer REFERENCES A2 (id),
A3_id integer REFERENCES A3 (id),
PRIMARY KEY (1_id, A1_id, A2_id, A3_id)
);
但這種感覺不正確,因爲一次只能填充A1_id,A2_id,A3_id中的一個(XOR)。
嘗試2
我隨後審議 「繼承」,順便this answer做的。但問題是,所有這些類:A,A1,A2和A3都只有一個屬性。像
CREATE TABLE A (
id SERIAL PRIMARY KEY NOT NULL,
attribute integer
);
CREATE TABLE A1 (
id SERIAL PRIMARY KEY NOT NULL,
attribute integer
);
etc
所以,如果我有A123繼承自A,他們從字面上不會有任何屬性。他們只是單獨的表格來幫助描繪關係。
CREATE TABLE A (
id SERIAL PRIMARY KEY NOT NULL,
attribute integer
);
CREATE TABLE A1 (
id integer PRIMARY KEY REFERENCES A (id) NOT NULL,
);
另外,如果我想獲得的所有表1中與特定的元組A1的元組,我可能還是得有多餘的列A來表示要搜索的子表,這是同樣的問題在嘗試1:
CREATE TABLE A (
id SERIAL PRIMARY KEY NOT NULL,
A1_id integer REFERENCES A1 (id),
A2_id integer REFERENCES A2 (id),
A3_id integer REFERENCES A3 (id),
attribute integer
);
嘗試3
我最初考慮並拒絕了這一結構。就最小的數據庫結構而言,這是最乾淨的,但是如果/ else查詢是必需的,我曾被告知這些查詢很混亂,並指向錯誤的數據庫設計。
我有表A具有單一的屬性(ERD中沒有顯示),然後是一個類型屬性,它告訴你表是A1,A2或A3中的哪一個。 if/else查詢來自遍歷A12和A23關係。如果元組是A1類型的,我將要搶回所有相關的A2元組。
嘗試4
這是我想出了最後,也許是最荒謬的想法。我想我會包括它,以表明我至少考慮過它。
有14個連接器表連接7個表與實際內容。但是通過這種設置,我們沒有任何空的列。
最後的思考
我覺得自己是最好的選擇是嘗試1和4,因爲案件嘗試3個交易和嘗試2只是讓一組基本上額外木匠表(並在不提高1)。
雖然它們都有缺點,但我一直無法找到任何關於數據庫設計的建議,這些建議都經過了基礎知識,所以我認爲我會檢查哪些最符合標準。
謝謝你們!
編輯:
我越去想它,更多的嘗試4似乎做了正確的事情。當然,有一百萬個連接器表,但是當你查詢其中的一個表時,不會有什麼困惑。
我還簡要地考慮了(剛纔)有一個A1,A2和A3主鍵序列,但根據「https://dba.stackexchange.com/questions/50652/sharing-a-single-primary-key-sequence-across-a-database」,這是不必要的,幾乎是一個壞主意。
下面是我嘗試正確組織ERD的鏈接:http://imgur.com/a/F3Jji – gchwalik