2009-10-23 50 views
2

我正在研究將應用程序從Oracle轉換爲擁有數據庫中所有業務邏輯的Postrges。目前有一個非常大的包含約200個公共常量變量。 Postgres不支持包級變量,所以我在討論如何轉換它。我看到兩種可能性,但需要一些意見關於哪個好(他們似乎都非常討厭):Oracle中的包級別常量到Postgres的轉換

  1. 將每個變量返回一個靜態值的函數。這似乎是最有可能的,但它看起來非常醜陋。
  2. 製作一張表。這個問題在於它們主要被其他包/功能使用。還有一個混合類型(數字與varchars)。

任何想法?

回答

1

我會選擇1,應該相當容易編寫一個腳本來自動爲你做這個,然後你保持包儘可能接近它的原始定義。

+0

我打算試試這個選項,主要是因爲所有依賴它的軟件包只有很小的變化。 – chotchki 2009-10-25 15:24:10

1

我想混合兩個選項。爲便於添加新的選項或修改的,易於使用的

create table package_options (option_name text, option_value text) 

,並返回一個功能在查詢:選項將被保存在一個表

create function get_option(text) returns text as 
$$ select option_value from package_options where option_name=$1 $$ 
language sql stable; 

也可能有get_int_option(text),轉換價值int等

您還可以添加option_type列和一些約束,這將檢查類型的有效性。

1

當你的問題出現時,我正在採取一種性能方法與接口方法。

根據您的數據庫使用情況,使用選項2可能會導致數據庫中出現熱點。這裏有一個更極端的情況 - 假設你有5000個用戶登錄系統,這反過來導致你的代碼被觸發,然後依次選擇你的package_options表。在任何特定時刻,您可能會有數千名用戶擊中該表。

這可能是一個問題,它可能不會PG處理併發,所以只有測試才能證明什麼。您必須測試才能確定,但​​在考慮該方法時應謹記。我也會測試你的選項1的情況,看看除了作爲一個簡單的界面來管理和使用之外,哪個更好。考慮到測試所需的測試會相對簡單,爲什麼不測試它,所以你不會因爲使用場景的糟糕選擇而陷入困境。