--- title: day11 database設計 tags: iThome(2022) description: note --- # day11 database設計 ### Database Normalization 資料正規劃為避免資料的異常更新、刪除,將數據分庫分表,以key連結起來 #### 1NF(First normal form) 第一正規式須遵守以下兩個規範 * 每個表格單元格應包含一個值。 * 每條記錄都必須是唯一的。 原始資料為 |姓名|電話|商品|價格| |---|---|---|---| |John|+9123|奶茶、紅茶|60、30| |Sam|+9124|綠茶、紅茶|30、30| |Jim|+9125|抹茶拿鐵|40| |Jim|+9125|抹茶拿鐵|40| |Timmy|+9126|青茶|35| 以下表格經過1NF調整,並且給予訂單編號用以區別每個欄位的值 |訂單編號|姓名|電話|商品|價格| |---|---|---|---|---| |d01|John|+9123|奶茶|60| |d02|John|+9123|紅茶|30| |d03|Sam|+9124|綠茶|30| |d04|Sam|+9124|紅茶|30| |d05|Jim|+9125|抹茶拿鐵|40| |d06|Jim|+9125|抹茶拿鐵|40| |d07|Timmy|+9126|青茶|35| #### 2NF * 將表格欄位相依部分分離出來,避免表格冗長 以上商品以及價格欄位都是跟產品有關,以下表格經過2NF調整 |訂單編號|姓名|電話|產品編號| |---|---|---|---| |d01|John|+9123|c01| |d02|John|+9123|c02| |d03|Sam|+9124|c03| |d04|Sam|+9124|c02| |d05|Jim|+9125|c04| |d06|Jim|+9125|c04| |d07|Timmy|+9126|c05| |產品編號|商品|價格| |---|---|---| |c01|奶茶|60| |c02|紅茶|30| |c03|綠茶|30| |c04|抹茶拿鐵|40| |c05|青茶|35| #### 3NF 消除資料表中的遞移相依,意思是在主表格中每個欄位應該都unique不互相依賴,向上表中姓名跟電話都是顧客資訊,因此應該再切分出來 |訂單編號|客戶資訊|產品編號| |---|---|---| |d01|s001|c01| |d02|s001|c02| |d03|s002|c03| |d04|s002|c02| |d05|s003|c04| |d06|s003|c04| |d07|s004|c05| |客戶資訊|姓名|電話| |---|---|---| |s001|John|+9123| |s002|Sam|+9124| |s003|Jim|+9125| |s004|Timmy|+9126| |產品編號|商品|價格| |---|---|---| |c01|奶茶|60| |c02|紅茶|30| |c03|綠茶|30| |c04|抹茶拿鐵|40| |c05|青茶|35| ### Database Indexing 首先再進入database的查詢方式前要先了解database的資料結構,再現在大多數的資料庫多為B+ tree結構,再某些情況下,使用index=1取代name='Alice'下查詢性能較好 |index|name| |---|---| |1|Alice| #### B tree 先從B tree架構開始介紹,以root為節點往下生長,root值為8往左邊走值(3、6)一定小於8,往右邊走值(10、15)一定大於8,但其有一明顯缺點,再進行index搜尋時,搜尋的速度不穩定,且當搜尋路線不佳時,會將整個tree遍歷造成搜索效能差。 假設今天要查找5~9的欄位,其查找為必須執行多次I/O ![](https://i.imgur.com/vJ07lyY.png) #### B+ tree B+ tree改善B tree缺點,只將值儲存在最下層節點,中間層都以指標方式儲存,查找到最下層時,如果大於目前值往右邊查找,小於則往左邊查找,可以大幅減少並穩定查找次數。 今天要查找5~9欄位,查找只需進行3次I/O後再最下層節點依序往右就行 ![](https://i.imgur.com/3exvQnZ.png) 詳細可看以下參考文章,筆者在設計資料庫目前多為使用ORM去設計,ORM本身就有設計效能優化,但比起使用原始sql指令能有一些效能消耗轉換,因此以後如須追求高效能系痛會再將此塊摸清楚。 ## 參考 * https://hackmd.io/@TSMI_E7ORNeP8YBbWm-lFA/rykcj8kmM?type=view * https://ithelp.ithome.com.tw/articles/10221971 * https://ithelp.ithome.com.tw/articles/10221111 ## Thank you! :dash: You can find me on - GitHub: https://github.com/shaung08 - Email: a2369875@gmail.com