1. 程式人生 > 實用技巧 >【Codeforces Round #247 (Div. 2) C】k-Tree

【Codeforces Round #247 (Div. 2) C】k-Tree

資料庫設計

實體之間的關係

  • 一對多(1:N)

    • 主表中的一條記錄對應從表中的多條記錄
    • 實現一對多的方式
      • 主鍵和非主鍵建關係
  • 多對一(N:1)

    • 多對一就是一對多
  • 一對一(1:1)

    • 如何實現一對一
      • 主鍵和主鍵建關係
    • 一對一兩個表完全可以用一個表實現,為什麼還要分成兩個表?
      • 表的垂直分割
        • 在欄位數量很多情況下,資料量也就很大
        • 每次查詢都需要檢索大量資料,這樣效率低下
        • 將所有欄位分成兩個部分,“常用欄位”和“不常用欄位”
        • 這樣對大部分查詢者來說效率提高了
  • 多對多(N:N)

    • 主表中的一條記錄對應從表中的多條記錄
    • 從表中的一條記錄對應主表中的多條記錄
    • 如何實現多對多
      • 利用第三張關係表
  • 小結

    • 如何實現一對一:主鍵和主鍵建關係
    • 如果實現一對多:主鍵和非主鍵建關係
    • 如何實現多對多:引入第三張關係表

資料庫設計

  • 資料庫設計的步驟
    • 收集資訊:與該系統有關人員進行交流、坐談,充分理解資料庫需要完成的任務
    • 標識物件(實體-Entity):標識資料庫要管理的關鍵物件或實體
    • 標識每個實體的屬性(Attribute)
    • 標識物件之間的關係(Relationship)
    • 將模型轉換成資料庫
    • 資料規範化

第一步:收集資訊

  • BBS論壇的基本功能
    • 使用者註冊和登入,後臺資料庫需要存放使用者的註冊資訊和線上狀態資訊
    • 使用者發貼,後臺資料庫需要存放貼子相關資訊,如貼子內容、標題等
    • 使用者可以對發帖進行回覆
    • 論壇版塊管理:後臺資料庫需要存放各個版塊資訊,如版主、版塊名稱、貼子數等

第二步:標識物件

  • 實體一般是名詞
    • 使用者物件
    • 板塊物件
    • 帖子物件
    • 跟帖物件

第三步:標識每個實體的屬性

  • 使用者物件

    • 暱稱
    • 密碼
    • 電子郵件
    • 生日
    • 性別
    • 使用者的等級
    • 備註資訊
    • 註冊日期
    • 狀態
    • 積分
  • 板塊物件

    • 板塊名稱
    • 版主
    • 本版格言
    • 點選率
    • 發帖數
  • 帖子物件

    • 發帖人
    • 發帖表情
    • 回覆數量
    • 標題
    • 正文
    • 發帖時間
    • 點選數
    • 狀態
    • 最後回覆時間
  • 跟貼物件

    • 帖子編號
    • 回帖人
    • 回帖表情
    • 標題
    • 正文
    • 回帖時間
    • 點選數

第四步:標識物件之間的關係

  • 繪製E-R圖

    • E-R(Entity-Relationship)實體關係圖
  • 符號及含義

    • □ 空方塊 實體,一般是名詞
    • ○ 空圓 屬性,一般是名詞
    • ◇ 空菱形 關係,一般是動詞
graph TD; 使用者物件 --> 管理 --> 板塊 使用者物件 --> 暱稱 使用者物件 --> ...
  • 將E-R圖轉成表
    • 實體轉成表,屬性轉成欄位
    • 如果沒有合適的欄位做主鍵,給表新增一個自動增長列做主鍵

第五步:將模型轉化為資料庫

  • 用EA軟體

第六步:資料規範化

  • 資料庫設計三正規化

    • 第一正規化:確保每列原子性
      • 確保每列的原子性,一個欄位表示一個含義
    • 第二正規化:非關鍵欄位必須依賴於關鍵欄位
      • 在滿足第一正規化的前提下,要求每個表只描述一件事情
    • 第三正規化:消除傳遞依賴
      • 在滿足第二正規化的前提下,除了主鍵以外的其他列消除傳遞依賴
  • 反3NF

    • 正規化越高,資料冗餘越少,但是效率有時就越地下,為了提高執行效率,可以適當讓資料冗餘。
  • 例題說明

    • 下面的設計不滿足第三正規化,但是高考分數表就是這樣設計的
    • 高考分數峰值訪問量非常大,這時候就是效能更重要
    • 當效能和規範化衝突的時候,我們首選效能
    • 這就是“反三正規化”
學號 姓名 語文 數學 總分
1 李白 77 88 165
  • 小結
    • 第一正規化約束的所有欄位
    • 第二正規化約束的主鍵和非主鍵的關係
    • 第三正規化約束的非主鍵之間的關係
    • 正規化越高,冗餘越少,但表數業越多
    • 規範化和效能的關係 :效能比規範化更重要

資料庫設計例題

  • 需求

    • 假設某建築公司要設計一個數據庫
    • 公司的業務規則概括說明如下
      • 公司承擔多個工程專案,每一項工程有:工程號、工程名稱、施工人員等
      • 公司有多名職工,每一名職工有:職工號、姓名、性別、職務(工程師、技術員)等
      • 公司按照工時和小時工資率支付工資,小時工資率由職工的職務決定(例如,技術員的小時工資率與工程師不同)
  • 標識實體

    • 工程表
    • 職工表
    • 職務表
    • 工時表
  • 資料庫設計

    • 工程表 --> 工程號 -> 工程名稱
    • 員工表 --> 職工表 -> 姓名 + 職務
    • 職務表 --> 職務 -> 小時工資率
    • 工時表 --> 工程號 + 職工號 -> 工時