2

背景:
兩個項目(A & B)在設計時同時需要一個新表(稱爲DocumentStore)來存放文件/文件在postgres下。數據庫設計 - 兩個項目應該共享同一個表嗎?

但周圍的文檔存儲業務邏輯是項目中的& B之間的不同,這意味着約DocumentStore關係是A & B.

之間的不同讓我們把這個有點更具體,見下面的例子:

文檔存儲表結構看起來是相同的,而不限制/外鍵:

DocumentStore

DocUUID //unique Id for this document, PK, FK to other table depends on project 
fileName //file name 
fileType //file type 
FileContent //store file as blog 

在項目一個DocumentStore.DocUUID引用Email.EmailUUID

注意是有一個電子郵件之間一對多的關係 - 通過FK> DocumentStore。

Email

EmailUUID //PK 
subject 
title 
... 

在項目DocumentStore.DocUUID引用Letter.LetterUUID

注意是有一個字母之間一對多的關係 - 通過FK> DocumentStore。

Letter

LetterUUID //PK 
UserId 
rightId 
... 

EmailLetter是因爲業務邏輯的不同完全不同。


我的問題是:

  1. 我應該分享項目之間的這種DocumentStore表格中的& B'

  2. 如果1.的答案是肯定的,那麼如何?通過postgres繼承?

  3. 如果1.的答案爲否,我應該創建兩個具有相同結構但不同表名和不同外鍵的表嗎?一個用於項目A和項目B?

+0

的核心問題是:在同一個文件鏈接到郵件*和*信往往?多久? –

+0

@ErwinBrandstetter:不同的文件鏈接到電子郵件和信件。對於信箱(可能是大多數情況下),對於電子郵件案例(可能是2/10箱)的情況會更少。我不確定爲什麼這是核心問題?你能否詳細說明一下? – Gob00st

+0

如果文檔中的單個行不在電子郵件和字母之間共享,則最好有單獨的表格開頭。你的回答我不清楚。我無法毫不含糊地解析「不同的文件鏈接到電子郵件和信件」。 –

回答

3

只有其中一個fk約束對錶的同一個實例的每列有效。你將不得不爲每個fk添加一列。或者有兩個documentstore表。

當你澄清,同一行中documentstore屬於字母或電子郵件,但只有那些的一個,而每個字母/電子郵件可以有多個文件。
因此,我的新建議:堅持你現在有的表設計,但創建兩個獨立的表。把他們放在同一張桌子裏沒有任何好處。兩個表共享相同結構的事實是沒有很好的理由來共享數據。

schema_a.documentstoreschema_b.documentstore繼承自master.documentstore。如果您的用例同時處理兩個表中的所有行,那麼這將非常有用。一定要閱讀關於limitations of inheritance in Postgres的章節。特別是,它不會讓你定義一個FK約束:

繼承特性的一個嚴重的侷限性是索引 (包括唯一約束)和外鍵約束只適用 單表,而不是給他們的繼承兒童。 在外鍵約束的引用和引用方都是如此。

相關答案與代碼示例:
Find out which schema based on table values
Create a table of two types in PostgreSQL

+0

感謝您的答覆,但通過DocUUID存在從電子郵件到DocumentStore表的一對多映射。如果我將DocUUID作爲外鍵包含在信件和電子郵件中,它會在電子郵件和信件中引入冗餘信息... – Gob00st

+0

您能告訴我在一對多映射方面繼承是如何幫助的嗎? – Gob00st

+0

@ Gob00st:我根據您的更新進行了更新。 –

0

同桌是罰款。那麼你有一些選擇 - 如果你需要在同一張桌子內部進行區分 - 你可能會添加一個'類型'列 - 我認爲你並不需要它,或者你建立關聯類到其他東西,例如:

Doc_email 
---------- 
DocUUID 
EmailUUID 

Doc_letter 
----------- 
DocUUID 
LetterUUID 
+0

所以你反對在DocumentStore表中增加一個枚舉類型?你是指什麼聯想班?你能詳細說明你的例子嗎?感謝 – Gob00st

+0

關聯表將兩個其他原子錶鏈接在一起,而不會影響任何一個。對於枚舉,我沒有發現通常是必需的。儘管您沒有指定您的業務規則,這可能是某種特殊情況。 – Randy

相關問題