Hi,大家好,
昨天說到了 UML,今天來提到資料庫相關,這次的 side project,預期使用的資料庫是 PostgreSQL,這個資料庫本身是所謂的關聯式資料庫,在這裡簡單的介紹關聯式資料庫的基本知識
表格是關聯式資料庫的重點項目,光是表格就有許多東西可以考慮了,例如說資料怎麼存放?各項資料預期開什麼型態?長度多長?表格本身需不需要設置外來鍵?我們一項一項來說明吧。
表格本身需要先設定好欄位,常見的欄位有下列幾種,且不同的資料庫可能會有不同的名稱,使用時需要注意。
型態 | 說明 |
---|---|
varchar, char | 文字欄位,設定時通常會用 ()指定長度,例如 varchar(50),varchar是所謂的可變長度的欄位,與char最大的差異就是差在 char(50)時,若資料只填入2個字的話,會被補上 48個空白字元,但是varchar則不會補上任何字元 |
text | 不限長度的文字,等同其他資料庫軟體的clob(雖然不限長度,但是還是有一個極限值,就是不能比記憶體大啦XDDD) |
integer, bigint, decimal | 整數型態,可透過()指定位數,例如 integer(4)表示數值上限為9999。數字本身不會帶小數點,所以在設計時要注意一下,若寫入的資料本身有小數部份,會自動被進位,這3種型態的差異在於數值範圍不同,以integer為例,其數值範圍為 -2147483648 到 +2147483647,雖然數字範圍很大,但是我也遇過破表的數字,所以若有超大數值需要時,可以考慮使用decimal |
real, double precision | 帶有小數點之數字,與整數型態相同,可使用()來指定位數,但是若設定為 real(5,2)時,表示總長度為 5位,其中有2位數是分給小數部份,也就是說數值上限為 999.99,使用時需注意 |
numeric | 這個型態與oracle 的 number 相同,若不指定範圍時,可以放不限位數的數字(不區分整數與非整數) |
bytea | 二進制資料,與其他資料庫軟體的 blob ,可以把圖檔、文件檔等非文字資料轉成位元組放進資料庫裡面,但是通常不建議這樣做,因為會加大資料庫的佔用空間,且可能會對版本升級造成困擾 |
補充:資料表欄位之長度會影響資料查詢的效能、主機硬碟空間的使用量,所以在規劃時,要注意型態與長度的限制,當一個資料庫中不管三七二十一都開text型態的話,會嚴重拖慢資料庫效能
欄位決定好之後,第二個要設定的東西是資料表的鍵值(key),鍵值分別三種,說明如下
鍵值 | 說明 |
---|---|
主鍵(primary key) | 一個表只能有一個,必需唯一,且通常會做為查詢之用的欄位(但是不一定),例如說資料表中有一個不重複流水號欄位,該流水號即可做為主鍵值用。若有複數欄位結合起來的內容是唯一值,亦可做為主鍵值用,稱為複合主鍵。主鍵還有一個用途,是做為其他表格的外鍵之用 |
唯一鍵(unique key) | 資料表中除主鍵之外之唯一值,一般是做為查詢之用,例如使用者資料表中,使用者帳號設為主鍵,但是資料表「員工編號」之欄位,即可將員工編號設為唯一鍵 |
外鍵(foreign key) | 與其他表格做為關聯之鍵值,用做關聯之用 |
建立主鍵時,最大的優點就是可以設成其他表格的外鍵,可將關聯建立起來,可保護資料的可用性,稍候於關聯部份詳細說明。
建立唯一鍵時,可避免資料重複輸入問題,且這幾年的做法
建立表格時,若指定索引欄位,可加快查詢速度,實測結果差異可到 60倍以上(血淋淋的教訓@@),且資料越多越有感,但是會稍微減慢資料寫入速度,因為索引的原理是會將索引資料另存一份出來,所以在寫入時,等同會寫入2次以上的資料,故索引在使用上是必用,但是也不能誤用。
補充:通常會是由DBA設定索引後,程式需按照索引的欄位來寫查詢功能
此為關聯式資料庫的重點,關聯的設計會影響到資料庫的寫入與查找功能,關聯分成三種,分別為
關聯 | 說明 |
---|---|
一對一 | 例如電商系統中,一個帳號只能有一個購物車資料,或是會計系統中,一個公司只能有一個帳本資料等情形 |
一對多 | 例如電商系統中,一個帳號可以有多筆訂單資料,此為一對多關聯 |
多對多 | 例如電商系統中,一個帳號可以買多個產品,但是反過來同一個產品可被不同帳號購買。一般多對多的狀況下是無法進行資料處理的,解決方法是拆分成數個一對多的關聯來處理 |
在關聯式資料庫中,A表格的主鍵即為B表格的外鍵,例如人事系統中,部門表的主鍵為部門ID,人事聘僱表中的主鍵為職員ID,但是該表中可以加開部門ID做為外鍵,此時就把資料庫關聯建立起來了 |
今天先介紹規劃資料庫的注意項目與資料章的基本知識,以及將關聯的種類與建立關聯的目的稍微進行說明,其實真正的大重點是所謂的六階正規化,但是那個真的有點多,而且了不起用到一半而已,有興趣的看倌可以去了解一下。
明天會進行資料庫剩下項目的教學、簡單的提一下SQL,並且繪製本次side project 的實體關聯圖。那就明日待續吧XDDD