2010-06-16 75 views
0

這可能是一個超級簡單的問題,但我努力想出正確的關鍵字在Google上找到它。如何根據其內容更改Postgres表數據?

我有一個Postgres表,它的內容之間有一個名爲content_type的文本類型的列。這存儲了該行中存儲哪種類型的條目。

只有大約5種不同的類型,我決定改變它們中的一個在我的應用中顯示爲別的東西(我一直在直接顯示這些東西)。

它讓我感到有趣的是,我的視圖是由我的數據庫模型決定的,我決定將存儲在數據庫中的類型轉換爲整數,並在應用程序中枚舉可能的類型,將它們轉換成它們的顯示名稱。這樣,如果我再次想要改變任何類別名稱的話,我可以用一個常數改變來改變它。我也有預感,存儲整數可能比在數據庫中存儲文本更高效。

首先,一個快速的閾值問題,這是一個好主意嗎?任何反饋或我錯過了什麼?

其次,我的主要問題是,我可以輸入什麼樣的Postgres命令來進行這種更改?我想我可以先將舊的content_type列重命名爲old_content_type,然後創建一個新的整數列content_type。但是,什麼命令會查看一行的old_content_type並根據它填寫新的content_type列?

回答

1

如果您發現需要更改顯示值,那麼是的,不要將它們存儲在數據庫中是個好主意。整數也更有效地存儲和搜索,但我真的不會擔心它,除非你有數百萬行。

你只需要運行更新來填充新列:如果你在Postgres的8.4然後使用enum type,而不是一個普通的整數可能是一個好主意

update table_name set content_type = (case when old_content_type = 'a' then 1 
    when old_content_type = 'b' then 2 else 3 end); 

+1

我個人認爲,枚舉是一個非常糟糕的主意;他們不會給你任何超過數字的東西 - 除非看起來像文本時,他們不是。讓前端理想地使用相關表來解釋這些值。 – 2010-06-17 12:10:45

+0

@Richard:我的觀點是,枚舉爲您提供了更好的可讀性,而不會使數據庫模式,查詢或應用程序代碼更加複雜。無論如何,看起來像文本的枚舉有什麼問題?我不想爲每個有2-3個固定值的字段創建一個新的表和外鍵,並在每個使用它的查詢中寫入額外的連接。您提供的解決方案類似地導致查詢和應用程序代碼更加複雜,不幸的是。但是,嘿,這就像靜態和動態類型 - 每個都是他自己的。 – 2010-06-17 20:57:23

+0

看起來像文本的枚舉問題很多。枚舉區分大小寫,空格很重要。 枚舉不允許翻譯成其他語言。 在代碼內使用文本字符串進行比較時,可能會拼錯,語言不會警告您。枚舉按照它們的創建順序排序。 枚舉不易維護,並將數據庫鎖定爲當今世界的一個版本。 我已經更深入地介紹了這一點:http://chateau-logic.com/content/why-we-should-not-use-enums-databases – 2010-06-26 14:27:26

1

理想情況下,您可以將這些字段引用包含類型定義的表。這應該通過外鍵約束。這樣你就知道你的數據庫是乾淨的並且沒有無效值(即參照完整性)。

有許多方法來處理這個問題:

  1. 具有每個字段的表中可以包含多個值(即像一個枚舉)是最明顯的 - 但它打破了,當你有一張需要許多屬性的表格。

  2. 您可以使用Entity-attribute-value model,但要注意,這太容易濫用,並且在事情發展時導致問題。

  3. 您可以使用或參考我的實施方案PET (Parameter Enumeration Tables)。這是一個介於1 &之間的中途房屋2.