為什麼要寫這篇?
專案開發過程中,常會需要設計schema,建立新的table,由於我是自學轉職的,所以其實對於什麼型別的特性與佔用空間沒什麼概念,以前只是覺得型別不就是 字串、數字、日期嗎,但隨著經驗累積,發現原來在這之下還有許多更細緻的型別,適用在不同情況,還有更進階的設計,而給與column適當的型別,對於正確性、效能也是有影響的,我們總會希望產品能夠好好的,在不同情況下都能運作正常,因此在前期設計的時候就滿重要的,以下是整理目前我常用且對於這些型別的理解,或許沒有到太深,但我秉持著夠用就好,能夠判別就好,如果後續有情境需要了解更深再了解囉~(ps: 以下是 postgresql 的例子)
有什麼重點呢?
Bit vs Byte ?
Bit(位元)、Byte(位元組),1 Byte = 8 Bits
Bit 為電腦運算的基礎,常用來作資料傳輸的單位,二進制(ex. 資料傳輸 用 bps = bit per second)
Byte電腦檔案大小的基本計算單位(ex. 檔案大小 Byte)
1byte = 8 Bits = 0~255的數字(二進位) = 一個英文字 = 一個符號 (2byte = 1中文字)
ref: https://ytliu0.pixnet.net/blog/post/229587764-bit、byte是什麼意思?bit、byte有什麼不同?
BigSerial 是什麼?
結尾為 Serial 皆不是正式型別,而只是方便建立唯一識別的值的語法,該特性是在插入資料時,資料庫會自動對單一筆資料給於順序編號
int2 vs. int4(int) vs int8
後方的數字表示是儲存時佔用的 bytes(ex. int2 = 2bytes 數字範圍 1 to 32767 ),要是儲存資料超過數字範圍,就會出錯.
目前設計時候會根據實際可能使用到的數字範圍,作為選擇依據
ref: https://docs.postgresql.tw/the-sql-language/data-types/numeric-types
json vs jasonb
資料欄位還可以是 json ,我第一次知道時真是驚為天人,這個欄位適合儲存重要性低、可能常變動的資料,重要性不足道可以給他一個正式欄位(ex. 說明備註)
兩者差異?
jsonb 把資料存進DB時,會多把輸入資料轉換成為二進位格式儲存,因此儲存資料時速度稍慢,但後續取用則不需解析,且增加索引處理功能
json 資料型別儲存與輸入字串完全相同的內容,處理函數必須在每次執行時重新解析;jsonb 資料型別則以分解後的二進位格式儲存,由於增加了轉換成本,因此資料輸入的速度稍慢,但由於後續不需要解析,因此處理速度明顯加快。jsonb 還支援索引處理,這是一個很大的優勢。
所以呢?