# 1. 設計你的Web資料庫 {%hackmd QnyEFBdERZebn4iQDXNPnA %} ## 本章重點:資料庫基本知識(導論) ## 01 關聯式資料庫概念 ### 架構 - Database - Table - Column - Row - Database-Table-Column-Row架構圖示 ![](https://i.imgur.com/kvizxFg.png) ### Table-Column-Row架構圖示 ![](https://i.imgur.com/5iLcMqV.png) ### 資料表(Table) - 就是表格(e.g. Excel表格) ### 欄位(Column) - 就是表格的**行** - Column - 又稱為欄(field) - 又稱為屬性(attribute) - 行裡面有鍵 - 就是獨有的號碼(用來識別) - e.g. CustomerID - 稱為鍵(key)或主鍵(primary key) - 注意:當自己的primary key出現在其他資料表中,就稱為外鍵(foreign key) ### 列(Row) - 就是表格的**列** - Row - 又稱為紀錄(record) - tuple - 列裡面有值 - 列與行對應到的**內容** ### 結構描述(schema) - 就是資料庫藍圖 ### 關係 - 分三種 - 一對一 - 一對多 - 多對多 - [如何辨識資料之間的關係](https://tinyurl.com/yynq236j) - 資料的關係會根據應用程式的需求而不同,那要如何辨識關係的種類呢? - 最基本的思考方式,是詢問在目前應用程式需求的情境下: - **資料 A 是否有多筆資料 B? 資料 B 是否有多筆資料 A?** - 如果兩個問題都是 No,代表資料 A 和 B 是一對一的關係。 - 如果其中一個是 No,而另一個是 Yes,那麼就是一對多的關係(看哪個資料是多的那方)。 - 如果兩個問題都是 Yes,那麼就是多對多的關係。 ## 02 設計你的Web資料庫 ### 思考你正在建模真實世界的物件 - 記住!當你在建立資料庫時,通常是為真實世界的物件與關係建立模型,並儲存相關資訊 - 因此!每個物件都擁有自己的資料表 ![](https://i.imgur.com/uSmGVUJ.jpg) ### 避免儲存重複的資料 - 會造成的問題 - 浪費空間 - 更新異常(update anomalies) - 資料因你改變資料庫而產生不一致的情況 - 修改異常 - 插入異常 - 刪除異常 ### 使用原子欄位值 - 每一列的每一個欄位只儲存一個東西 - 當你需要使用非原子欄位時,應考慮非關聯式資料庫。 - e.g. - NoSQL - datastores ### 選擇合理的鍵 - 確保你選的鍵是獨有的 ### 思考你想問資料庫什麼問題? - 你希望資料庫回答什麼問題? ### 避免用許多空的屬性來設計 - 避免浪費儲存空間 - 看到null,意義不清。有可能是以下情況: - 屬性不相關? - 資料庫儲存錯誤訊息? - 資料還沒有輸入? - 因此需要使用不同設計避免過多null的問題 ### 資料表型態摘要 - 資料庫設計**最終**包含兩種資料表 - 描述真實世界物件的簡單資料表 - 一對一 - 一對多 - e.g.一位客人可能多筆訂單,但一筆訂單只會有一位客人。因此要在訂單中放入指向顧客的參考。 - 互相連結的資料表 - 多對多 - e.g. Orders與Books之間的關係。這些資料表通常與某種真實世界的交易(transaction)有關 ## 03 web資料庫架構 - web資料庫系統與外部架構圖示 - 基本操作 - 含資料庫的操作 ![](https://i.imgur.com/I4Zi1Gj.jpg)