2017-07-18 54 views
2

所以我有一個PG函數create_order(語言是PL/PGSQL),它接受了很多參數。 我注意到,每次我修改參數名稱,它的類型,或者如果我添加了一個新的說法,我不得不放棄功能(CREATE OR REPLACE不工作)PostgreSQL - 使用JSONB作爲單一函數參數的任何缺點

所以我一直在想,如果我只是接受一個jsonb類型的單個參數,並把它稱爲一天......所以簽名會看起來像create_order(args jsonb)

我的問題是

  1. 這被認爲是不好的做法在PG「世界」(影響性能或其他某些方面)或者從編程的角度來看不好的做法
  2. 如果#1是不好的方法,最好是創建自定義複合類型並將其用作函數的參數?
+0

如果您更改其簽名,重新創建函數有什麼錯誤?無論如何,你必須更新電話,不是嗎? – JGH

+0

我不會先使用它,因爲你會有轉換參數類型的缺點。第二個我已經用在我的時間和給你的要求(有些不變的變化)我認爲這是一個更好的方法,我會去爲它。即使在您使用它的代碼中,每次都不需要更改(除了第一個,顯然),您可以保持更好的可維護性。我沒有把它作爲答案加入,因爲這是一個意見,我只是沒有投票結束,因爲這是一個很好的問題。 –

回答

1

我沒有看到一個jsonb函數參數的大問題,除了單個參數可能使輸入值更明顯。但這不是文檔無法解決的問題。

另一方面,我也看到簽名更改時丟棄和重新創建函數沒有問題。它可能提醒呼叫站點需要更新。

我想說,你應該採用適合你的方法,並且手頭最好的問題最好從PostgreSQL的角度來看並不重要。

+0

丟棄和重新創建對我來說不是問題,但是當函數在其他函數中使用時,它會變得毛茸茸。然後,你必須級聯刪除並重新創建它們(除非我錯過了某些東西?) – zam6ak

+0

函數之間不存在任何依賴關係,例如視圖和表之間的依賴關係,因此您可以刪除並重新創建在另一個函數中調用的函數。但是,如果簽名發生變化,則必須更改調用函數以避免函數調用時出現運行時錯誤。但是你必須修改調用函數,對吧? –