Postgresql

需要更好的方法來設計這種關係

  • January 26, 2021

我有一個 table fluxo,而fluxo 有很多fluxo_acao,但是一個 entryfluxo_acao可以有三種類型,每種類型都有它們的特殊性。為了實現這一點,我創建了更多三個表(fluxo_acao_mensagemfluxo_acao_perguntafluxo_acao_escolher_fila,連接到fluxo_acao.

問題是我無法選擇三個表中的任何一個fluxo,因為首先我需要檢查類型是什麼,然後我進行查詢。

我需要一種更好的方法來完成這種關係或連接fluxo_acao到三個表。甚至為什麼我需要再創建兩個。這是改變的最佳時機。

流動 動作流 其他三張表

有人剛剛告訴我繼承可以幫助我。我正在尋找如何。

所以我不能確切地看到你的主鍵是什麼,但聽起來你的問題不在於子類型本身,而更有可能是主鍵和路徑依賴的選擇。

因此,如果fluxo有一個主鍵id_fluxo,並且與的關係fluxo_acao是一對多且重複項沒有受到嚴格控制,則可以將主鍵設置為:

  1. id_fluxo_acao- 糟糕,只是一個行指針
  2. (id_fluxo, id_fluxo_acao)- 好吧,仍然是一個行指針,但不知道什麼是唯一的
  3. (id_fluxo, ordem) (流程,訂單?) - 更好,但根據您的評論,它可能會經常更新,並且需要更新相關的子類型。
  4. (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),您可以直接查詢單個表。

引用自:https://dba.stackexchange.com/questions/284037