1. 程式人生 > >資料庫結構設計(邏輯設計和物理設計)

資料庫結構設計(邏輯設計和物理設計)

1、資料庫結構設計的步驟

需求分析:全面瞭解產品設計的儲存需求

邏輯設計:設計資料的邏輯儲存結構

物理設計:根據所用的資料庫特點進行表結構設計

                  關係型資料庫:Oracle、SQLServer、MySQL、postgresSQL

                  非關係型資料庫:mongo、Redis、Hadoop

                  儲存引擎:Innodb

維護優化:根據實際情況對索引、儲存結構等進行優化

2、資料庫設計正規化(設計出沒有資料冗餘和資料維護異常的資料庫結構)

資料庫設計第一正規化:

        1、資料庫表中的所有欄位都只具有單一屬性

        2、單一屬性的列是由基本的資料型別所構成的

        3、設計出來的表都是簡單的二維表

資料庫設計第二正規化:

        要求一個表中只具有一個業務主鍵,也就是說符合第二正規化的表中不能存在非主鍵列對只對部分主鍵的依賴關係

資料庫設計第三正規化:

        指每一個非主屬性既不部分依賴於也不傳遞依賴於業務主鍵,也就是在第二正規化的基礎上消除了非主鍵屬性對主鍵的傳遞依賴

3、需求分析及邏輯設計(重點)

 

4、需求分析及邏輯設計-反正規化化設計

什麼叫做反正規化化設計?

反正規化化是針對正規化化而言的,在前面介紹了資料庫設計的正規化,所謂的反正規化化就是為了效能和讀取效率的考慮而適當的對資料庫設計正規化的要求進行違反,而允許存在少量的資料冗餘,換句話來說,反正規化化就是使用空間來換取時間。

注意:不能完全按照正規化化的要求進行設計,考慮以後如何使用表

4、正規化化設計和反正規化化設計的優缺點

正規化化設計的優點:

         1、可以儘量減少資料冗餘

         2、正規化化的更新操作比反正規化化更快

         3、正規化化的表通常比反正規化化更小

正規化化設計的缺點:

         1、對於查詢需要對多個表進行關聯   

         2、更難進行索引優化

反正規化化設計的優點:

        1、可以減少表的關聯

        2、可以更好的進行索引優化

反正規化化設計的缺點:

        1、存在資料冗餘及資料維護異常

         2、對資料的修改需要更多的成本

5、物理設計

根據所選擇的關係型資料庫的特點對邏輯模型進行儲存結構設計

物理設計涉及的內容:

      1、定義資料庫、表及欄位的命名規範

              a、資料庫、表及欄位的命名要遵守可讀性原則

              b、資料庫、表及欄位的命名要遵守表意性原則

              c、資料庫、表及欄位的命名要遵守長名原則

      2、選擇合適的儲存引擎

     3、為表中的欄位選擇合適的資料型別

     4、建立資料庫結構

6、物理設計-資料型別的選擇

為表中的欄位選擇合適的資料型別:

        當一個列可以選擇多種資料型別時,應該優先考慮數字型別,其次是日期或二進位制型別,最後是字元型別。對於相同級別的資料型別,應該優先選擇佔用空間小的資料型別。

如何選擇正確的整數型別:

如何選擇正確的實數型別:

如何選擇varchar和char型別:

  varchar型別的儲存特點:

       a、varchar用於儲存變長字串,只佔用必要的儲存空間。

      b、列的最大長度小於255則只佔用一個額外位元組用於記錄字串長度

      c、列的最大長度大於255則要佔用兩個額外位元組用於記錄字串長度

varchar長度的選擇問題:

      a、使用最小的符合需求的長度

      b、varchar(5)和varchar(200)儲存MySQL字串效能不同

varchar適用場景:

    a、字串列的最大長度比平均長度大很多

    b、字串列很少被更新

    c、使用了多位元組字符集儲存字串

char型別儲存特點:
    a、char型別是定長的

    b、字串儲存在char型別的列中會自動刪除末尾的空格

    c、char型別的最大寬度為255

char型別適用的場景:

   a、cahr型別適合儲存長度近似的值

   b、char型別適合儲存短字串

   c、char型別適合儲存經常更新的字串列

 

如何儲存日期型別:

timestamp可以自動更新:

 

date型別和time型別:

   1、date型別的優點:

       a、佔用的位元組數比使用字串、datetime、int儲存要少,使用date型別只需要3個位元組。

       b、使用date型別還可以利用日期時間函式進行日期之間的計算