# 1. 設計你的Web資料庫
{%hackmd QnyEFBdERZebn4iQDXNPnA %}
## 本章重點:資料庫基本知識(導論)
## 01 關聯式資料庫概念
### 架構
- Database
- Table
- Column
- Row
- Database-Table-Column-Row架構圖示

### Table-Column-Row架構圖示

### 資料表(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資料庫
### 思考你正在建模真實世界的物件
- 記住!當你在建立資料庫時,通常是為真實世界的物件與關係建立模型,並儲存相關資訊
- 因此!每個物件都擁有自己的資料表

### 避免儲存重複的資料
- 會造成的問題
- 浪費空間
- 更新異常(update anomalies)
- 資料因你改變資料庫而產生不一致的情況
- 修改異常
- 插入異常
- 刪除異常
### 使用原子欄位值
- 每一列的每一個欄位只儲存一個東西
- 當你需要使用非原子欄位時,應考慮非關聯式資料庫。
- e.g.
- NoSQL
- datastores
### 選擇合理的鍵
- 確保你選的鍵是獨有的
### 思考你想問資料庫什麼問題?
- 你希望資料庫回答什麼問題?
### 避免用許多空的屬性來設計
- 避免浪費儲存空間
- 看到null,意義不清。有可能是以下情況:
- 屬性不相關?
- 資料庫儲存錯誤訊息?
- 資料還沒有輸入?
- 因此需要使用不同設計避免過多null的問題
### 資料表型態摘要
- 資料庫設計**最終**包含兩種資料表
- 描述真實世界物件的簡單資料表
- 一對一
- 一對多
- e.g.一位客人可能多筆訂單,但一筆訂單只會有一位客人。因此要在訂單中放入指向顧客的參考。
- 互相連結的資料表
- 多對多
- e.g. Orders與Books之間的關係。這些資料表通常與某種真實世界的交易(transaction)有關
## 03 web資料庫架構
- web資料庫系統與外部架構圖示
- 基本操作
- 含資料庫的操作
