資料庫設計

2021-10-07 19:54:28 字數 3860 閱讀 2571

物理設計要做什麼?

選擇合適的資料庫管理系統。

考慮因素:成本,業務場景,開發語言,功能,作業系統等。

2.定義資料庫,表及字段,要符合命名規範。

選擇儲存引擎:這裡以mysql為例

表及字段命名規範

3.根據選擇的資料庫管理系統選擇合適的資料型別

常用資料型別及占用空間

字段型別的選擇的原則

1.當乙個列可以選擇多種資料型別的時候,優先考慮數字型別,其次是日期型別和二進位制型別,最後是字元型別。

2.對於相同的資料型別,應考慮占用空間較小的資料型別。

字段型別的選擇的原則依據

1.在對資料進行比較(查詢條件,join條件及排序)操作時,同樣的資料,字元處理往往比數字處理效率要低,因為字元要參考資料字典進行比較,數字就不需要。

2.在資料庫中,資料處理以頁為單位,列的長度越小,一頁中儲存的資料就越多,載入相同的資料時的頁數就相對較小,速度會更快。

如何具體選擇字段型別?

1.char和varchar該如何選擇?

2.decimal和float該如何選擇?

3.時間型別如何儲存?

1.如何選擇主鍵?

(1)區分業務主鍵和資料庫主鍵:

(2)考慮主鍵是否要自動順序增長:部分資料庫是按照主鍵的順序邏輯儲存的。

(3)主鍵的字段型別所占用的空間要盡可能小:對於使用聚集索引方式儲存的表,每個索引都會附加上主鍵資訊。

2.避免使用外來鍵(避免使用資料庫來提供外來鍵約束功能):限於網際網路專案

(1)在高併發業務中,使用外來鍵約束會降低資料匯入的效率,增加維護成本。

(2)建議使用邏輯外來鍵,事實上在資料庫中並沒有設定外來鍵約束,但在專案上都認為這是外來鍵。由程式來維護外來鍵約束,而不是資料庫伺服器本身來實現該功能。

(3)相關聯的列要建立索引,增加查詢效率。

(4)該怎麼建立表就怎麼建立表,只是沒有了foreign key (user_id) referencesuser(id)該條外來鍵約束命令。

例如:使用資料庫建立外來鍵約束:

create

table

`m_user`

(`id`

int(11)

notnull

auto_increment

comment

'主鍵'

,`user_name`

varchar(50

)not

null

default

''comment

'使用者名稱'

,primary

key(

`id`))

engine

=innodb

default

charset

=utf8;

create

table

`m_order`

(`id`

int(11)

notnull

auto_increment

comment

'主鍵'

,`total_price`

decimal(10

,2)not

null

default

'0.00'

,`user_id`

int(11)

notnull

default

'0',

primary

key(

`id`),

constraint

`for_indx_user_id`

foreign

key(

`user_id`

)references

`user`(

`id`))

engine

=innodb

default

charset

=utf8;

不使用資料庫建立外來鍵約束:

create

table

`m_user`

(`id`

int(11)

notnull

auto_increment

comment

'主鍵'

,`user_name`

varchar(50

)not

null

default

''comment

'使用者名稱'

,primary

key(

`id`))

engine

=innodb

default

charset

=utf8;

create

table

`m_order`

(`id`

int(11)

notnull

auto_increment

comment

'主鍵'

,`total_price`

decimal(10

,2)not

null

default

'0.00'

,`user_id`

int(11)

notnull

default

'0',

primary

key(

`id`),

key`idx_user_id`

(`user_id`),

)engine

=innodb

default

charset

=utf8;

3.避免使用觸發器(1)觸發器是乙個隱藏的儲存過程,因為它不需要引數,不需要顯示呼叫,往往在你不知情的情況下已經做了很多操作,無形中增加了系統的複雜性。

(2)涉及到複雜的邏輯的時候,觸發器的巢狀是避免不了的,如果再涉及幾個儲存過程,再加上事務等等,很容易出現死鎖現象。

(3)儲存過程的致命傷在於移植性,儲存過程不能跨庫移植,在後期系統公升級維護時難度加大。

4.謹慎使用預留字段

無法準確的知道預留欄位的型別。

無法知道預留欄位中所儲存的內容。

後期維護預留欄位的成本高。

建議:(1)「按需設計」,在經過詳細有效的分析之後,在資料表中只放置必要的字段,而不要留出大量的備用字段。

(2)如果數量很少,而且資訊的性質與原表密切相關,那麼就可以直接在原表上動態增加字段,並將相關的資料更新進去

(3)如果數量較大,或者並非是原表物件至關重要的屬性,那麼就可以新增乙個表,然後通過鍵值連線起來。

5.反正規化化設計。

什麼是反正規化化?

適當的違反的正規化的要求,允許少量的資料冗餘,用空間換取時間。

優點:增加查詢效率。

三正規化核心思想:不要出現冗餘,

資料庫設計的核心原則:既要考慮資料庫儲存空間,又要考慮查詢速度。

反正規化的常用方法:橫向切割表;縱向切割表;增加冗餘列;增加附加列(計算列)

資料庫設計 設計資料庫之前

1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...

資料庫設計 設計資料庫之前

1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...

資料庫設計 設計資料庫之前

1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...