Postgresql
需要更好的方法來設計這種關係
我有一個 table
fluxo
,而fluxo 有很多fluxo_acao
,但是一個 entryfluxo_acao
可以有三種類型,每種類型都有它們的特殊性。為了實現這一點,我創建了更多三個表(fluxo_acao_mensagem
和fluxo_acao_pergunta
)fluxo_acao_escolher_fila
,連接到fluxo_acao
.問題是我無法選擇三個表中的任何一個
fluxo
,因為首先我需要檢查類型是什麼,然後我進行查詢。我需要一種更好的方法來完成這種關係或連接
fluxo_acao
到三個表。甚至為什麼我需要再創建兩個。這是改變的最佳時機。有人剛剛告訴我繼承可以幫助我。我正在尋找如何。
所以我不能確切地看到你的主鍵是什麼,但聽起來你的問題不在於子類型本身,而更有可能是主鍵和路徑依賴的選擇。
因此,如果
fluxo
有一個主鍵id_fluxo
,並且與的關係fluxo_acao
是一對多且重複項沒有受到嚴格控制,則可以將主鍵設置為:
id_fluxo_acao
- 糟糕,只是一個行指針(id_fluxo, id_fluxo_acao)
- 好吧,仍然是一個行指針,但不知道什麼是唯一的(id_fluxo, ordem)
(流程,訂單?) - 更好,但根據您的評論,它可能會經常更新,並且需要更新相關的子類型。(id_fluxo, timestamp)
- 最好,提供唯一性並提供有價值的元數據然後每個子類型的主鍵將包含
id_fluxo
並且您可以直接連接fluxo
到任何子類型。你的評論:
但是可以說我想從fluxo中選擇三個表中的所有條目,我怎麼能用連接來做到這一點。在fluxo_acao中添加這個其他pk之後
這可以通過一個簡單的查詢輕鬆完成,稍後可以將其強化為視圖:
SELECT fluxo.id_fluxo ,fluxo.descricao ,fluxo.id_status ,fluxo.data_criacao ,fluxo.id_empresa ,fluxo.tipo ,fluxo_acao.tipo AS acao_tipo ,fluxo_acao.timestamp ,fluxo_acao.ordem /* columns from each subtype */ FROM fluxo fluxo INNER JOIN fluxo_acao fluxo_acao ON fluxo_acao.id_fluxo = fluxo.id_fluxo LEFT JOIN fluxo_acao_mensagem fluxo_acao_mensagem ON fluxo_acao_mensagem.id_fluxo = fluxo_acao.id_fluxo AND fluxo_acao_mensagem.timestamp = fluxo_acao.timestamp /* Not sure what the Portuguese would be for "created at" or "CreateTimestamp" */ LEFT JOIN fluxo_acao_pergunta fluxo_acao_pergunta ON fluxo_acao_pergunta.id_fluxo = fluxo_acao.id_fluxo AND fluxo_acao_pergunta .timestamp = fluxo_acao.timestamp LEFT JOIN fluxo_acao_escolher_fila fluxo_acao_escolher_fila ON fluxo_acao_escolher_fila.id_fluxo = fluxo_acao.id_fluxo AND fluxo_acao_escolher_fila.timestamp = fluxo_acao.timestamp
如果只需要其中一種子類型(並且不需要 column
ordem
),您可以直接查詢單個表。