【Codeforces Round #247 (Div. 2) C】k-Tree
阿新 • • 發佈:2020-11-29
資料庫設計
實體之間的關係
-
一對多(1:N)
- 主表中的一條記錄對應從表中的多條記錄
- 實現一對多的方式
- 主鍵和非主鍵建關係
-
多對一(N:1)
- 多對一就是一對多
-
一對一(1:1)
- 如何實現一對一
- 主鍵和主鍵建關係
- 一對一兩個表完全可以用一個表實現,為什麼還要分成兩個表?
- 表的垂直分割
- 在欄位數量很多情況下,資料量也就很大
- 每次查詢都需要檢索大量資料,這樣效率低下
- 將所有欄位分成兩個部分,“常用欄位”和“不常用欄位”
- 這樣對大部分查詢者來說效率提高了
- 表的垂直分割
- 如何實現一對一
-
多對多(N:N)
- 主表中的一條記錄對應從表中的多條記錄
- 從表中的一條記錄對應主表中的多條記錄
- 如何實現多對多
- 利用第三張關係表
-
小結
- 如何實現一對一:主鍵和主鍵建關係
- 如果實現一對多:主鍵和非主鍵建關係
- 如何實現多對多:引入第三張關係表
資料庫設計
- 資料庫設計的步驟
- 收集資訊:與該系統有關人員進行交流、坐談,充分理解資料庫需要完成的任務
- 標識物件(實體-Entity):標識資料庫要管理的關鍵物件或實體
- 標識每個實體的屬性(Attribute)
- 標識物件之間的關係(Relationship)
- 將模型轉換成資料庫
- 資料規範化
第一步:收集資訊
- BBS論壇的基本功能
- 使用者註冊和登入,後臺資料庫需要存放使用者的註冊資訊和線上狀態資訊
- 使用者發貼,後臺資料庫需要存放貼子相關資訊,如貼子內容、標題等
- 使用者可以對發帖進行回覆
- 論壇版塊管理:後臺資料庫需要存放各個版塊資訊,如版主、版塊名稱、貼子數等
第二步:標識物件
- 實體一般是名詞
- 使用者物件
- 板塊物件
- 帖子物件
- 跟帖物件
第三步:標識每個實體的屬性
-
使用者物件
- 暱稱
- 密碼
- 電子郵件
- 生日
- 性別
- 使用者的等級
- 備註資訊
- 註冊日期
- 狀態
- 積分
-
板塊物件
- 板塊名稱
- 版主
- 本版格言
- 點選率
- 發帖數
-
帖子物件
- 發帖人
- 發帖表情
- 回覆數量
- 標題
- 正文
- 發帖時間
- 點選數
- 狀態
- 最後回覆時間
-
跟貼物件
- 帖子編號
- 回帖人
- 回帖表情
- 標題
- 正文
- 回帖時間
- 點選數
第四步:標識物件之間的關係
-
繪製E-R圖
- E-R(Entity-Relationship)實體關係圖
-
符號及含義
□ 空方塊
實體,一般是名詞○ 空圓
屬性,一般是名詞◇ 空菱形
關係,一般是動詞
- 將E-R圖轉成表
- 實體轉成表,屬性轉成欄位
- 如果沒有合適的欄位做主鍵,給表新增一個自動增長列做主鍵
第五步:將模型轉化為資料庫
- 用EA軟體
第六步:資料規範化
-
資料庫設計三正規化
- 第一正規化:確保每列原子性
- 確保每列的原子性,一個欄位表示一個含義
- 第二正規化:非關鍵欄位必須依賴於關鍵欄位
- 在滿足第一正規化的前提下,要求每個表只描述一件事情
- 第三正規化:消除傳遞依賴
- 在滿足第二正規化的前提下,除了主鍵以外的其他列消除傳遞依賴
- 第一正規化:確保每列原子性
-
反3NF
- 正規化越高,資料冗餘越少,但是效率有時就越地下,為了提高執行效率,可以適當讓資料冗餘。
-
例題說明
- 下面的設計不滿足第三正規化,但是高考分數表就是這樣設計的
- 高考分數峰值訪問量非常大,這時候就是效能更重要
- 當效能和規範化衝突的時候,我們首選效能
- 這就是“反三正規化”
學號 | 姓名 | 語文 | 數學 | 總分 |
---|---|---|---|---|
1 | 李白 | 77 | 88 | 165 |
- 小結
- 第一正規化約束的所有欄位
- 第二正規化約束的主鍵和非主鍵的關係
- 第三正規化約束的非主鍵之間的關係
- 正規化越高,冗餘越少,但表數業越多
- 規範化和效能的關係 :效能比規範化更重要
資料庫設計例題
-
需求
- 假設某建築公司要設計一個數據庫
- 公司的業務規則概括說明如下
- 公司承擔多個工程專案,每一項工程有:工程號、工程名稱、施工人員等
- 公司有多名職工,每一名職工有:職工號、姓名、性別、職務(工程師、技術員)等
- 公司按照工時和小時工資率支付工資,小時工資率由職工的職務決定(例如,技術員的小時工資率與工程師不同)
-
標識實體
- 工程表
- 職工表
- 職務表
- 工時表
-
資料庫設計
- 工程表 --> 工程號 -> 工程名稱
- 員工表 --> 職工表 -> 姓名 + 職務
- 職務表 --> 職務 -> 小時工資率
- 工時表 --> 工程號 + 職工號 -> 工時