Postgresql

低基數欄位:整數或字元串

  • October 23, 2015

工單具有以下狀態:

new
in_progress
on_hold
closed

我可以創建ticket.status一個字元串 ( on_hold) 或一個唯一的 int( 2)。它被索引。

Int 優點:索引中的最小尺寸

Int con:BI 和不斷發展的模式的清晰度低(3相比closed

String pro:清晰的數據導航

String con:索引佔用更多空間,相同 RAM 的性能更低

我想如果它的基數低,字元串索引不會比 int 索引佔用太多空間。如果欄位具有低基數並且不是複合索引的一部分,那麼選擇整數是否過早優化?

我將 Postgres 與 SQLAlchemy、Python ORM 一起使用。

我肯定會為大桌子標準化。您可以將帶有FK 約束integer的or列用於查找表。int2

對於小桌子,您的任何一個想法都可以。如果有疑問,請遵守項目的指導方針。

我都不會。反而:

一個列舉值佔用磁碟上的四個字節。

  • 對於大表:使用"char"欄位(1 字節)作為查找表的 FK。對於非常小的查找值集是一個不錯的選擇。每個值都可以是被引用狀態的助記符:
status_id | status
----------+------------
n         | new
i         | in_progress
o         | on_hold
c         | closed

這也取決於全貌。如果無論如何都不會失去對齊填充,您實際上只會在表和索引中節省空間(並獲得性能)。更多的:

對於字元類型(“char”除外),排序規則也可能是相關的。更多的:

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