數據庫 -- 表設計1

一對一關係:

一對多模型:

商城中的 商品表shop_product   和   商品物品表 shop_product_item  是 一對多關係 。 關聯字段是shop_product_item的product_id字段

多對多模型:

合能項目中   角色表manager_role   和   菜單表manager_menu  是多對多關係。中間表爲manager_role_menu   

三大範式:

1NF:

數據庫表的每一列都是不可分割的基本數據項;

2列的屬性相近或者相似,儘量合併成一樣的列

2NF:

首先滿足1NF,要求表的每條記錄可以唯一區分(主關鍵字),要求實體(記錄)的非主屬性完全依賴於主關鍵詞。

3NF:

必須先滿足2NF  ; 要求表中的每一列只與主鍵直接相關而不是間接相關。

3大範式總結:

  • 2列的屬性相近或者相似,儘量合併成一樣的列
  • 第二範式是說一張表中包含了所種不同的實體屬性,那麼要必須分成多張表,
  • 第三範式是要求已經分成了多張表,那麼一張表中只能有另一張表中的id(主鍵),而不能有其他的任何信息(其他的信息一律用主鍵在另一表查詢)。

 

數據庫命名:

  • 字段和表名稱 應該是  a_b , 用下劃線隔開

 

navicat查看mysql表的關係:

數據庫設計:

概念:

  • 根據業務系統需要,結合選用的DBMS,爲業務系統構造出最優的數據存儲模型,建立好數據庫中表結構及表與表之間的管理關係

爲什麼要進行數據庫設計??

物理設計:

目的:建立表結構

1、選擇數據庫系統:應用特點、成本
2、定義庫、表、字段的命名規範(數據庫系統對此有限制)
3、根據系統選擇合適的字段類型
4、反範式化設計:增加冗餘,提高效率

備註:反範式,不滿足範式的模型,就是反範式模型。反範式跟範式所要求的正好相反,在反範式的設計模式,我們可以允許適當的數據的冗餘,用這個冗餘去取操作數據時間的縮短。本質上就是用空間來換取時間,把數據冗餘在多個表中,當查詢時可以減少或者是避免表之間的關聯。(如果關聯查詢效率很低,可以考慮使用反範式設計)

 

選擇哪種數據庫??

  • 成本 方面
  • 事務成本 (大的事務操作)

備註:事務的大小通常是指一個事務中所處理的數據的多少和所包括的SQL語句的數量,比如說,我們在一個事務中既包括了UPDATE,INSERT,DELETE語句同時以有大量的SELECT語句那邊這個事務就可以認爲是一個大事務。

  1. 開發使用的語言

Java,php  --  mysql ,oracle

  1. 應用場景

開源數據庫 --- 適用於互聯網項目

商業數據庫 ---  更適合企業級項目

mysql常用的存儲引擎:

表及字段的命名規則:

1、可讀性原則

表名使用大寫和小寫來格式化庫對象名字以獲得良好的可讀性。

字段使用下劃線來連接

2、表意性原則

對象的名字應該可以描述他所標識的對象

3、長名原則

儘可能少使用或者不使用縮寫,適用於數據庫名之外的對象

數據庫字段類型選擇原則:

舉例:

字段類型原則原則:當一個列可以選擇多種數據類型時,應該優先考慮數字類型,其次是日期或者二進制類型,

最後纔是字符類型。隊友相同級別的數據類型,應該有限選擇佔用空間小的數據類型。

char和varchar如何選擇??

  • char列的長度固定爲聲明的長度  ; varchar列的值爲可變長字符串,長度爲  L+1 字節 ;varchar需要額外的字節存儲大小
  • 如果列中的最大長度小於50byte,一般考慮用char (一般不宜定義大於50byte的char類型列) 
  • 如果列中要存儲的數據長度差不多一致,應該考慮用char,否則用varchar
  • 舉例:身份證號、手機號使用char  ; 

decimal 和 float如何選擇??

  • decimal用於存儲精確數據
  • 由於float的存儲空間開銷比decimal,故非精確數據優先選擇float類型

時間類型如何選擇??

使用int來存儲時間字段的優缺點:

  • 優點:字段長度比datetime小
  • 缺點:使用不方便,需要進行函數轉換
  • 限制:之惡能存儲到2038-01-19  

如何選擇主鍵??

https://blog.csdn.net/ruicanshuei/article/details/50850644

避免使用外鍵約束??

  • 降低數據導入的效率
  • 增加維護成本

避免使用觸發器??

  • 降低數據導入的效率
  • 可能會出現意想不到的數據異常
  • 使業務邏輯變的複雜

關於預留字段

  • 無法準確的知道預留字段的類型
  • 無法準確的知道預留字段中所存儲的內容
  • 後期維護預留字段所要的成本,同增加一個字段所需要的成本相同的
  • 嚴謹使用預留字段
  • 需要根據實際情況考慮

 

爲什麼要反範式化??

舉例:

sql中select佔比更多,所以可以增加讀取效率,但是插入效率較低

反範式化優缺點:

  • 減少表的關聯數量
  • 增加數據的讀取效率
  • 反範式化一定要適度(如果大量使用反範式化,會導致大量操作異常)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章