Views: 5
現代的程式設計,除了上傳的檔案、文件、圖片等資料是直接存在硬碟,使用者的資料完全都是存在資料庫系統當中。這篇文章我們會學習怎開資料庫帳號、新增資料庫、新增資料表。
事前準備
開啟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
- 飲食(葷食、素食)
標籤RadioButtonList
lbFood
輸入框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)
- 飲食(葷食、素食)
資料類型Food
int
- 活動場次:
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