一、規範化
資料庫規範化有一些規則。每一條規則都被稱為“規範形式”。如果遵守第一條規則,則稱資料庫處于“第一範式”。
如果遵守前三條規則,則認為資料庫處于“第三範式”。盡管可以進行其他級别的規範化,但第三種範式被認為是大多數應用程式所必需的最進階别。
下面的描述包括一些示例。
第一範式- 消除單個表中的重複組。
- 為每組相關資料建立一個單獨的表。
- 用主鍵辨別每一組相關資料。
- 不要在一個表中使用多個字段來存儲類似的資料
上述記錄中的字段Class1、Class2和Class3表示設計問題
第二範式
- 為應用于多個記錄的值集建立單獨的表。例如學生和老師的關系
- 将這些表與外鍵關聯。消除備援資料.
上述表中每個學生的多個類值。Class#在功能上不依賴于Student(主鍵),拆表設計
第三範式
- 消除不依賴于鍵的字段。
- 隻對頻繁變化的資料應用第三範式可能更可行。
- 如果某些依賴字段仍然存在,請将應用程式設計為在任何更改時要求使用者驗證所有相關字段。
規範化示例表
(源文連結:https://docs.microsoft.com/en-us/office/troubleshoot/access/database-normalization-description)
二、資料類型
定義适當的屬性類型.可以提高資料庫的性能,還能在存儲資料前驗證資料
我們應該在“integer”、“numeric”字段中儲存數值資料;在“timestamp”、“timestamptz”字段中儲存時間戳;在“bit”、“char(1)”或“boolean”字段中儲存布爾值等等。
日期值得特别注意。如果 Date 屬性假設隻有日期部分(OrderDate,ReleaseDate),請使用沒有時間部分的 Date 類型。如果你隻需要保留時間(StartTime,EndTime),就使用合适的時間類型。
如果不需要指定精度,則将其指定為零(“time(0)”)。
對帶有時間部分的日期,有一個問題是,你必須總是截斷時間部分,隻顯示日期,并且當你要在與資料庫所在時區不同的地方顯示時,要確定格式化後不會顯示成昨天或明天。
當跳轉到夏令時的時候,帶有時間部分的日期時間加減也可能出現問題
三、限制
将無效資料排除在外,并確定資料的健壯性
非空限制
業務規則要求該屬性應該始終存在,那麼要毫不猶豫地将其設定為 Not Null,其他可選的資訊字段可能還是可以設定為 Null
一個典型的例子是,Employee 表的 ManagerId,并不是所有員工都有經理。不要試圖讓 ManagerId 不為空,并為沒有經理的員工插入“0”或“-1”。當我們添加外鍵限制時,這将導緻其他問題.
唯一限制
根據業務規則,一些屬性(或屬性的組合)應該是惟一的,比如 Id、PinNumber、BookId 和 AuthorId、OrderNo 等。應該通過添加惟一限制來保證這些屬性的惟一
主鍵
Not Null 和唯一限制一起構成主鍵
當我們想到主鍵時,會很快想到 Id 或 ObjectId 之類的列。但是主鍵也可以是複合的,比如 BookId 和 AuthorId。
通常,使用單獨的 Id 列是一種更好的方法,因為它可以使連接配接更加清晰,還能友善地将另一列添加到惟一組合中。但是,即使有了一個單獨的主鍵(Id),我們還是要為 BookId 和 AuthorId 列添加唯一限制
Check 限制
Check 限制允許我們定義資料的有效值 / 範圍。适合 Check 限制的屬性有百分比(0 到 100 之間)、狀态(0、1、2)、價格、金額、總數(大于或等于 0)、PinNumber(固定長度)等。
不要嘗試将業務邏輯編碼到 Check 限制中
預設限制
預設限制也很重要。它們允許我們向現有表中添加新的 Not Null 列
外鍵限制
外鍵限制是關系資料庫設計之王。外鍵與主鍵一起確定表之間的資料一緻性
索引
原文連結(https://relinx.io/2020/09/14/old-good-database-design/)
https://mp.weixin.qq.com/s?fontRatio=1&__biz=MzIzNjUxMzk2NQ==&mid=2247500981&idx=1&sn=26b93e89d2150dc44b98c5cf77e5cf21&scene=26&subscene=315&passparam=searchid%3D11833991003153723536&clicktime=1602289832&enterid=1602289832&ascene=64&devicetype=android-29&version=3.0.31.2998&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=A2CqoctPxsLk2qcaBJndMzk%3D&pass_ticket=AeoyHMe7YVa2hOL9uxk%2BOw0790A2FXshS%2BUv07sp6gPbwX27PjB%2Fc%2FF9P14Uqlkg&wx_header=1&platform=win
出處:轉載請注明 https://www.cnblogs.com/sun-null/