Views: 7
現代的程式設計,除了上傳的檔案、文件、圖片等資料是直接存在硬碟,使用者的資料完全都是存在資料庫系統當中。這篇文章我們會學習怎開資料庫帳號、新增資料庫、新增資料表。
事前準備
開啟SSMS
搜SSMS 然後開啟SQL Server Management Studio 20
SSMS 連線資料庫
我這邊是連線開發環境,因此伺服器名稱跟驗證都不需要修改
只要勾選「信任伺服器憑證」>連線
新增資料庫
開啟PartyRegister資料庫
可以將資料庫旁邊的+點開,可以看到剛新增的資料庫PartyRegister
普遍我們會打開到資料表的位置。
新增一張資料表
資料表用滑鼠點右鍵>新增>資料表
一般來說,重點在
- 欄位名,自己取名
 - 資料類型,字串、數字
 - 描述:備註這個欄位要存什麼等等的備註。
 
資料庫欄位型態對應懶人包
資料表的欄位如同Excel的欄位,不過資料庫本身會嚴格去限制資料庫內的資料類型。
我自己的筆記大概是這樣
| 輸入的資料 | 資料類型分類 | SQL SERVER資料類型 | C#對應變數類型 | 備註 | 
|---|---|---|---|---|
| 多語言文字 | 多語言文字 | nvarchar | string | 不確定內容的 | 
| 英文、數字、標點 | 文字 | varchar | string | 帳號、身份證字號、Email | 
| 2024/2/14 0800 | 日期時間(單一時區) | DateTime2 | DateTime | 日期時間 | 
| 2024/2/14 0800+8:00 | 日期時間(多時區) | datetimeoffset(7) | DateTimeOffset | 日期時間+時區 | 
| 123456 | 數字 | int or double | int or long | 整數 or 長整數 | 
| 1000元 | 金額 | decimal | decimal | 金額 | 
| 19.3 | 小數 | float or double | float or double | 不是金額的小數點,看精確度進行選擇 | 
| 是/否 (單選) | 布林 | bit(1) | bool | 單一Checkbox會用這種,例如「啟用」 | 
| 單選(下拉選單或Radio) | 數字 | int | int | 多數時候會直接用數字代表,這個作法稱為Magic Number | 
| 單選(下拉選單或Radio) | 文字 | varchar | string | 有時會直接存文字 | 
| checkbox 多選 (CheckboxList)  | 文字 | varchar | string | 用逗點分隔選擇的項目 例如: 1,2,3,18,23  | 
多選checkbox
多選在資料庫比較特別,存在資料庫大致上有三種作法
- 單一文字欄位使用逗點或分號分隔,或存入json 陣列,最常見,但比不容易搜尋與統計。
 - 多個bit欄位代表,一個欄位一個bit,代表一個勾,如果多選的項目是固定的多半會使用這個方式,例如場地開放時間的星期幾,這作法好處是搜尋時候效率會好很多。
 - 關聯資料表,放在另一張資料表(最少見),這情況是要快速統計,但同時選項又是會變動的才會這樣做。
 
PK Primary Key (ID 欄位)
PK = 主鍵 = 主索引鍵 = Primary Key
資料庫的世界,通常每筆資料都會有一個欄位作為主要索引,這個欄位的每一筆值都不能重複是重點,用途類似點餐單上的單號或寄送包裹時候的郵件編號,要製造這個值普遍上作法有幾種作法
- 自動增加的
int欄位,自動跳號的流水號。這個做法最常使用,慣例上會用這個欄位作為PK並且取名為ID,優點就是速度快,找資料的速度也快,缺點是資安比較薄弱,再來遇到資料表或資料庫要合併時要重新產生會相當麻煩,但我一律推薦普通的資料用這個。 - GUID欄位,這個做法第二常見會產生一串類似
e3750be7-dc3d-48fd-af1f-9efccac4e1c5這樣的值,這個優點是因為GUID的資料目前沒辦法猜,缺點是關聯式資料庫用這個當索引效率會超級差,通常跟帳號有關的我推薦用這個。 - 單一自訂的欄位,例如發票號碼、郵件編號、身份證字號、銀行戶頭帳號、表單編號,要這樣設計時,同時還要設計產生編號的規則與取號程式,設計時也需怎處理好索引效率問題。
 - 多欄位作為主鍵,我看過用身分證字號+生日兩個欄位作為主鍵的,實際上發生嚴重的效率問題,不知道誰腦袋撞到這樣設計。
 
每張資料表盡量都要有一個PK欄位,強烈要求「只有」一個,多個PK欄位會造成尋找效率緩慢,而且擴充上問題很多。
建立第一個欄位 ID
- 資料行名稱輸入ID
 - 資料類型int
 - 允許Null不要勾
 - 描述輸入「主鍵」
 - 下方的資料行屬性找到「識別規格」點選 > 可以展開
 - 將「為識別」改成「是」
 
設定為主索引鍵
對著ID的前面按下滑鼠右鍵,選擇設定主索引鍵,設定好之後會看到如下圖,會多一個金鑰匙的圖案
加入報名表的欄位
報名表單上的欄位
- 姓名 
TextBox標籤lbName輸入框tbName - 性別(男女其他)
RadioButtonList標籤lbGender輸入框rbGender - 生日(西元年月日)
TextBox標籤lbBirthday輸入框tbBirthday - 身分證字號(10碼)
TextBox標籤lbROCID輸入框tbROCID - 信箱 
TextBox標籤lbEmail輸入框tbEmail - 電話 
TextBox標籤lbPhone輸入框tbPhone - 飲食(葷食、素食)
標籤RadioButtonListlbFood輸入框rbFood - 活動場次(三個日期單選):1月場次 2月場次 3月場次 
RadioButtonList標籤lbEventId輸入框rbEventId - 送出按鈕
Button btnSubmit 
整理成資料庫欄位
- 姓名 
Name資料類型nvarchar(50) - 性別(男女其他)
Gender資料類型int - 生日(西元年月日)
Birdthday資料類型lbBirthday - 身分證字號(10碼)
ROCID資料類型varchar(10) - 信箱 
Email資料類型varchar(200) - 電話 
Phone資料類型varchar(20) - 飲食(葷食、素食)
資料類型Foodint - 活動場次:
EventId資料類型int - 報名時間:
CreateTime資料類型DateTime2 
說明:
- 姓名除了中文可能還會有其它語言,像是日文,所以用 
nvarchar(50),如果遇到人名很長的,擴充長度就好,但普遍50已經夠用多數情境。 - 性別、活動場次、食物 等單選項目使用
int代表對應的選擇項目。 - 身份證字號跟Email因為不會出現中文字,所以使用
varchar就好。 - 身份證字號的欄位普遍會用
ROCID,我待過幾間公司的政府專案都這樣命名。 - 電話的格式雖然普遍都是數字,但會出現
0933-111-111或0800-000-333普遍就會用varchar。順便一提,如果你使用int,會發生0900存入後變成900,會被去除前面的0,所以千萬不能用int儲存電話 - 報名時間是額外記錄的,我們順便在預設值輸入
getdate(),這樣系統就會以這筆資料產生時間作為預設值。 
varchar其實也能存中文字,不過遇到某些字例如「堃」就會變成?? 或奇怪的字元,根本原因是varchar一個字的編碼長度是nvarchar的一半而已,所以不只外文,許多中文字也會變成亂碼。因此普遍有需要中文或其它字元的內容一律使用nvarchar
Q為什麼文字欄位不統一使用nvarchar(max)就好
- 以前的硬碟很貴,所以儲存空間是嚴格限定的,這跟系統資源管理有關。
 - 效率
 - 資料一致性限制,限制資料長度減少異常資料。
 
儲存資料表
新資料表設計好了之後,我們可以按下ctrl+s儲存,這時候就會詢問資料表名稱
然後關閉這個設計(有需要修改還是可以叫出來)
重新整理後就匯出現剛新增的資料表
下一堂課 SSMS的基本操作
下一堂課會教一些基本SQL操作
				
0 Comments