物理設計要做什麼?
選擇合適的資料庫管理系統。
考慮因素:成本,業務場景,開發語言,功能,作業系統等。
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.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...